tutorial - pandas python شرح




إضافة صف واحد في pandas.DataFrame (11)

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

import pandas as pd
import numpy as np
# we know we're gonna have 5 rows of data
numberOfRows = 5
# create dataframe
df = pd.DataFrame(index=np.arange(0, numberOfRows), columns=('lib', 'qty1', 'qty2') )

# now fill it up row by row
for x in np.arange(0, numberOfRows):
    #loc or iloc both work here since the index is natural numbers
    df.loc[x] = [np.random.randint(-1,1) for n in range(3)]
In[23]: df
Out[23]: 
   lib  qty1  qty2
0   -1    -1    -1
1    0     0     0
2   -1     0    -1
3    0    -1     0
4   -1     0     0

مقارنة السرعة

In[30]: %timeit tryThis() # function wrapper for this answer
In[31]: %timeit tryOther() # function wrapper without index (see, for example, @fred)
1000 loops, best of 3: 1.23 ms per loop
100 loops, best of 3: 2.31 ms per loop

و- اعتبارًا من التعليقات - بحجم 6000 ، يصبح فارق السرعة أكبر:

زيادة حجم الصفيف (12) وعدد الصفوف (500) يجعل فرق السرعة أكثر مدهشة: 313 مللي ثانية مقابل 2.29 ثانية

أنا أفهم أن الباندا مصممة لتحميل DataFrame بالكامل ولكن أحتاج إلى إنشاء DataFrame فارغًا ثم أضف صفوفًا واحدة تلو الأخرى . ما هي أفضل طريقة للقيام بذلك ؟

لقد أنشأت بنجاح DataFrame فارغًا مع:

res = DataFrame(columns=('lib', 'qty1', 'qty2'))

ثم يمكنني إضافة صف جديد وتعبئة حقل بـ:

res = res.set_value(len(res), 'qty1', 10.0)

يعمل ولكن يبدو غريبا جدا: - / (فشل في إضافة قيمة سلسلة)

كيف يمكنني إضافة صف جديد إلى DataFrame (مع نوع أعمدة مختلفة)؟


اجعله بسيط. عن طريق أخذ القائمة كمدخل والتي سيتم إلحاقها كصف في إطار البيانات: -

import pandas as pd  
res = pd.DataFrame(columns=('lib', 'qty1', 'qty2'))  
for i in range(5):  
    res_list = list(map(int, input().split()))  
    res = res.append(pd.Series(res_list,index=['lib','qty1','qty2']), ignore_index=True)

طريقة أخرى للقيام بذلك (ربما لا يكون أداء للغاية):

# add a row
def add_row(df, row):
    colnames = list(df.columns)
    ncol = len(colnames)
    assert ncol == len(row), "Length of row must be the same as width of DataFrame: %s" % row
    return df.append(pd.DataFrame([row], columns=colnames))

يمكنك أيضًا تحسين فئة DataFrame مثل:

import pandas as pd
def add_row(self, row):
    self.loc[len(self.index)] = row
pd.DataFrame.add_row = add_row

قم بإنشاء سجل جديد (إطار البيانات) وأضفه إلى old_data_frame .
تمرير قائمة القيم وأسماء الأعمدة المقابلة لإنشاء new_record (data_frame)

new_record = pd.DataFrame([[0,'abcd',0,1,123]],columns=['a','b','c','d','e'])

old_data_frame = pd.concat([old_data_frame,new_record])

مثال على @ رد عبد الناصر:

>>> import pandas as pd
>>> df = pd.DataFrame(columns=['lib', 'qty1', 'qty2'])
>>> for i in range(5):
>>>     df.loc[i] = [randint(-1,1) for n in range(3)]
>>>
>>> print(df)
    lib  qty1  qty2
0    0     0    -1
1   -1    -1     1
2    1    -1     1
3    0     0     0
4    1    -1    -1

[5 rows x 3 columns]

من أجل الطريقة البيثونية ، هنا أضف جوابي:

res = pd.DataFrame(columns=('lib', 'qty1', 'qty2'))
res = res.append([{'qty1':10.0}], ignore_index=True)
print(res.head())

   lib  qty1  qty2
0  NaN  10.0   NaN

يمكنك أيضا بناء قائمة من القوائم وتحويلها إلى dataframe -

import pandas as pd

rows = []
columns = ['i','double','square']

for i in range(6):
    row = [i, i*2, i*i]
    rows.append(row)

df = pd.DataFrame(rows, columns=columns)

إعطاء

    i   double  square
0   0   0   0
1   1   2   1
2   2   4   4
3   3   6   9
4   4   8   16
5   5   10  25

يمكنك إلحاق صف واحد كقاموس باستخدام خيار ignore_index .

>>> f = pandas.DataFrame(data = {'Animal':['cow','horse'], 'Color':['blue', 'red']})
>>> f
  Animal Color
0    cow  blue
1  horse   red
>>> f.append({'Animal':'mouse', 'Color':'black'}, ignore_index=True)
  Animal  Color
0    cow   blue
1  horse    red
2  mouse  black


لإلحاق فعال راجع كيفية إضافة صف إضافي إلى dataframe pandas و Setting With Enlarge .

أضف صفوفًا من خلال loc/ix على بيانات فهرس المفاتيح غير الموجودة . على سبيل المثال:

In [1]: se = pd.Series([1,2,3])

In [2]: se
Out[2]: 
0    1
1    2
2    3
dtype: int64

In [3]: se[5] = 5.

In [4]: se
Out[4]: 
0    1.0
1    2.0
2    3.0
5    5.0
dtype: float64

أو:

In [1]: dfi = pd.DataFrame(np.arange(6).reshape(3,2),
   .....:                 columns=['A','B'])
   .....: 

In [2]: dfi
Out[2]: 
   A  B
0  0  1
1  2  3
2  4  5

In [3]: dfi.loc[:,'C'] = dfi.loc[:,'A']

In [4]: dfi
Out[4]: 
   A  B  C
0  0  1  0
1  2  3  2
2  4  5  4
In [5]: dfi.loc[3] = 5

In [6]: dfi
Out[6]: 
   A  B  C
0  0  1  0
1  2  3  2
2  4  5  4
3  5  5  5

mycolumns = ['A', 'B']
df = pd.DataFrame(columns=mycolumns)
rows = [[1,2],[3,4],[5,6]]
for row in rows:
    df.loc[len(df)] = row




pandas