it-swarm.asia

كيفية تحويل pandas DataFrame مجموعة فرعية من الأعمدة والصفوف إلى صفيف numpy؟

أتساءل عما إذا كانت هناك طريقة أبسط وفعالة في الذاكرة لتحديد مجموعة فرعية من الصفوف والأعمدة من pandas DataFrame.

على سبيل المثال ، بالنظر إلى قاعدة البيانات هذه:

 df = DataFrame (np.random.Rand (4،5) ، الأعمدة = list ('abcde')) 
 print df 
 
 abcde 
 0 0.945686 0.000710 0.909158 0.892892 0.326670 
 1 0.919359 0.667057 0.462478 0.008204 0.473096 
 2 0.976163 0.621712 0.208423 0.980334 

أريد فقط تلك الصفوف التي تكون فيها قيمة العمود 'c' أكبر من 0.5 ، لكنني أحتاج فقط إلى العمودين 'b' و 'e' لتلك الصفوف.

هذه هي الطريقة التي توصلت إليها - ربما هناك طريقة أفضل "الباندا"؟

 locs = [df.columns.get_loc (_) لـ _ في ['a'، 'd']] 
 print df [df.c> 0.5] [locs] 
 
 إعلان 
 0 0.945686 0.892892 

هدفي الأخير هو تحويل النتيجة إلى صفيف numpy لتمريرها إلى خوارزمية انحدار sklearn ، لذلك سأستخدم الكود أعلاه مثل هذا:

 training_set = array (df [df.c> 0.5] [locs]) 

... وهذا يزعجني منذ أن انتهى بي المطاف بنسخة صفيف ضخمة في الذاكرة. ربما هناك طريقة أفضل لذلك أيضا؟

42
John Prior

.loc قبول محددات الصفوف والأعمدة في وقت واحد (كما تفعل .ix/.iloc لمعلوماتك) ويتم ذلك في مسار واحد كذلك.

In [1]: df = DataFrame(np.random.Rand(4,5), columns = list('abcde'))

In [2]: df
Out[2]: 
          a         b         c         d         e
0  0.669701  0.780497  0.955690  0.451573  0.232194
1  0.952762  0.585579  0.890801  0.643251  0.556220
2  0.900713  0.790938  0.952628  0.505775  0.582365
3  0.994205  0.330560  0.286694  0.125061  0.575153

In [5]: df.loc[df['c']>0.5,['a','d']]
Out[5]: 
          a         d
0  0.669701  0.451573
1  0.952762  0.643251
2  0.900713  0.505775

وإذا كنت تريد القيم (على الرغم من أن هذا يجب أن ينتقل مباشرة إلى sklearn كما هي) إطارات تدعم واجهة مجموعة

In [6]: df.loc[df['c']>0.5,['a','d']].values
Out[6]: 
array([[ 0.66970138,  0.45157274],
       [ 0.95276167,  0.64325143],
       [ 0.90071271,  0.50577509]])
9
Jeff

استخدم قيمتها مباشرة:

In [79]: df[df.c > 0.5][['b', 'e']].values
Out[79]: 
array([[ 0.98836259,  0.82403141],
       [ 0.337358  ,  0.02054435],
       [ 0.29271728,  0.37813099],
       [ 0.70033513,  0.69919695]])
70
waitingkuo

ربما شيء من هذا القبيل بالنسبة للمشكلة الأولى ، يمكنك ببساطة الوصول إلى الأعمدة بأسمائها:

>>> df = pd.DataFrame(np.random.Rand(4,5), columns = list('abcde'))
>>> df[df['c']>.5][['b','e']]
          b         e
1  0.071146  0.132145
2  0.495152  0.420219

للمشكلة الثانية:

>>> df[df['c']>.5][['b','e']].values
array([[ 0.07114556,  0.13214495],
       [ 0.49515157,  0.42021946]])
16
Daniel