Pandas: عند إضافة سلسلة إلى DataFrame بمؤشر مختلف ، يتم تحويل السلسلة إلى جميع NaNs

تم إنشاؤها على ٦ ديسمبر ٢٠١١  ·  9تعليقات  ·  مصدر: pandas-dev/pandas

مثال على ذلك:

>>> df
               RP/Rsum  P.value
ID                             
A_23_P42353    17.8     0      
A_23_P369994   15.91    0      
A_33_P3262440  436.7    0.0005 
A_32_P199429   18.97    0      
A_23_P256724   22.24    0      
A_33_P3394689  24.24    0      
A_33_P3403117  27.14    0      
A_24_P252364   28.56    0      
A_23_P99515    31.82    0      
A_24_P261750   31.46    0 

>>> df.dtypes
RP/Rsum    float64
P.value    float64

>>> ids = pandas.Series(['51513', '9201', np.nan, np.nan, '8794', '6530', '7025', '4897', '84935', '11081'])
>>> df["test"] = ids
>>> df
               RP/Rsum  P.value  test
ID                                   
A_23_P42353    17.8     0        NaN 
A_23_P369994   15.91    0        NaN 
A_33_P3262440  436.7    0.0005   NaN 
A_32_P199429   18.97    0        NaN 
A_23_P256724   22.24    0        NaN 
A_33_P3394689  24.24    0        NaN 
A_33_P3403117  27.14    0        NaN 
A_24_P252364   28.56    0        NaN 
A_23_P99515    31.82    0        NaN 
A_24_P261750   31.46    0        NaN 
>>> df.dtypes
RP/Rsum    float64
P.value    float64
test       object

يحدث هذا أيضًا مع الكائنات الطافية وما شابه. لست متأكدا ما هو الزناد.

التعليق الأكثر فائدة

يتم إعطاء السلسلة مؤشرًا ضمنيًا 0 ، ... ، N-1 عندما لا تقدم واحدًا - لذلك هذا هو بالضبط السلوك الذي أتوقعه. إذا كان data عبارة عن مصفوفة ndarray أولية أو قائمة ، فلن يحدث هذا. إذن حقيقة أنه عندما تفعل:

df[col] = series

وتتوافق السلسلة تمامًا مع الفهرس df ، هذه ميزة وليست خطأ :) لذا

df['test'] = ids.values

ستعمل بشكل جيد في مثالك

ال 9 كومينتر

أتساءل عما إذا كان الأمر متعلقًا بهذه المشكلة التي وجدتها أيضًا هذا الصباح:

>>> df = pandas.DataFrame(index=[1,2,3,4])
>>> df["test"] = pandas.Series(["B", "fdf", "344", np.nan])
>>> df["test2"] = ["B", "fdf", "344", np.nan]
>>> df   test  test2
1  fdf   B    
2  344   fdf  
3  NaN   344  
4  NaN   nan  

يبدو أنه نوع من الخطأ الفردي بالنسبة لي.

يؤدي المزيد من البحث إلى استدعاء Series.reindex عند تعيين العناصر على أنها الجاني:

>>> data 
0    B
1    fdf
2    344
3    NaN

>>>  df.index = ["A", "B", "C", "D"]
>>> data.reindex(df.index).values
array([nan, nan, nan, nan], dtype=object)

يؤدي المزيد من البحث إلى reindex في سمة الفهرس التي يتم استدعاؤها والتي تعطي نتيجة غريبة:

>>> data.index.reindex(df.index)
(Index([A, B, C, D], dtype=object), array([-1, -1, -1, -1], dtype=int32))

ثم تُترجم هذه -1 إلى NaNs.

تم تحديث عنوان الخطأ مع المزيد من الوصف الصحيح.

يتم إعطاء السلسلة مؤشرًا ضمنيًا 0 ، ... ، N-1 عندما لا تقدم واحدًا - لذلك هذا هو بالضبط السلوك الذي أتوقعه. إذا كان data عبارة عن مصفوفة ndarray أولية أو قائمة ، فلن يحدث هذا. إذن حقيقة أنه عندما تفعل:

df[col] = series

وتتوافق السلسلة تمامًا مع الفهرس df ، هذه ميزة وليست خطأ :) لذا

df['test'] = ids.values

ستعمل بشكل جيد في مثالك

في هذه الحالة ربما يجب توثيقه في مكان ما إذا لم يكن كذلك بالفعل. في غضون ذلك ، سأقوم بتعديل الكود الخاص بي كما اقترحت ، شكرًا.

http://pandas.sourceforge.net/dsintro.html#column -selection-add-deletion

When inserting a Series that does not have the same index as the DataFrame, it will be conformed to the DataFrame’s index:

In [180]: df['one_trunc'] = df['one'][:2]

In [181]: df
Out[181]: 
   one  flag   foo  one_trunc
a  1    False  bar  1        
b  2    False  bar  2        
c  3    True   bar  NaN      
d  NaN  False  bar  NaN      

You can insert raw ndarrays but their length must match the length of the DataFrame’s index.

ما هي الفكرة وراء حقيقة أنه عند إدراج سلسلة ليس لها نفس الفهرس مثل DataFrame ، فسوف تتوافق مع فهرس DataFrame؟

عند إنشاء DataFrame من سلسلة ، يغطي الفهرس الناتج جميع فهارس السلاسل الفردية. فلماذا لم يتم استخدام هذه الفكرة عند df ['new_column'] = series؟
لذا تحاول إضافة البيانات ، ولكن تتجاهل كل القيم التي لا تتطابق مع فهرس DataFrame؟
إذا كان _index extension_ موجودًا ، فيمكن للمرء دائمًا أن يفعل df ['new_column'] = series.reindex (df.index) عندما لا يرغب المرء في تمديد الفهرس (السلوك الحالي)؟

In [256]: df = pandas.DataFrame({'A': pandas.Series(['foo', 'bar'], index=['a', 'b']),
   .....:                        'B': pandas.Series([10, 20], index=['b', 'c'])})

In [257]: df
Out[257]:
   A    B
a  foo  NaN
b  bar  10.000
c  NaN  20.000

In [258]: df['C'] = pandas.Series(range(3), index=['a', 'c', 'd'])

In [259]: df
Out[259]:
   A    B       C
a  foo  NaN     0.000
b  bar  10.000  NaN
c  NaN  20.000  1.000

في المثال أعلاه ، أتوقع وجود صف 'd' في DataFrame.

حسنًا ، أعتقد أن الفكرة الأساسية هي أن DataFrame عبارة عن "حاوية سلسلة شبيهة بطول ثابت". عندما تقوم بإنشاء DataFrame بإملاء من السلسلة بدون فهرس صريح ، فلا يوجد فهرس واضح بخلاف اتحادهم جميعًا.

أستطيع أن أرى حجة تمديد المؤشر ضمنيًا ، ولكن هناك مقايضات في كلتا الحالتين

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات