[英]Python pandas: fill a dataframe row by row
向pandas.DataFrame
對象添加一行的簡單任務似乎很難完成。 有 3 個與此相關的 stackoverflow 問題,但沒有一個給出有效的答案。
這就是我想要做的。 我有一個 DataFrame,我已經知道它的形狀以及行和列的名稱。
>>> df = pandas.DataFrame(columns=['a','b','c','d'], index=['x','y','z'])
>>> df
a b c d
x NaN NaN NaN NaN
y NaN NaN NaN NaN
z NaN NaN NaN NaN
現在,我有一個函數來迭代計算行的值。 如何使用字典或pandas.Series
填充其中pandas.Series
? 以下是失敗的各種嘗試:
>>> y = {'a':1, 'b':5, 'c':2, 'd':3}
>>> df['y'] = y
AssertionError: Length of values does not match length of index
顯然它試圖添加一列而不是一行。
>>> y = {'a':1, 'b':5, 'c':2, 'd':3}
>>> df.join(y)
AttributeError: 'builtin_function_or_method' object has no attribute 'is_unique'
非常無信息的錯誤消息。
>>> y = {'a':1, 'b':5, 'c':2, 'd':3}
>>> df.set_value(index='y', value=y)
TypeError: set_value() takes exactly 4 arguments (3 given)
顯然,這僅用於在數據框中設置單個值。
>>> y = {'a':1, 'b':5, 'c':2, 'd':3}
>>> df.append(y)
Exception: Can only append a Series if ignore_index=True
好吧,我不想忽略索引,否則結果如下:
>>> df.append(y, ignore_index=True)
a b c d
0 NaN NaN NaN NaN
1 NaN NaN NaN NaN
2 NaN NaN NaN NaN
3 1 5 2 3
它確實將列名與值對齊,但丟失了行標簽。
>>> y = {'a':1, 'b':5, 'c':2, 'd':3}
>>> df.ix['y'] = y
>>> df
a b \
x NaN NaN
y {'a': 1, 'c': 2, 'b': 5, 'd': 3} {'a': 1, 'c': 2, 'b': 5, 'd': 3}
z NaN NaN
c d
x NaN NaN
y {'a': 1, 'c': 2, 'b': 5, 'd': 3} {'a': 1, 'c': 2, 'b': 5, 'd': 3}
z NaN NaN
那也慘敗。
你是怎么做到的 ?
df['y']
將設置一列
因為你想設置一行,使用.loc
請注意, .ix
在這里是等效的,您的失敗是因為您嘗試為行y
每個元素分配一個字典,這可能不是您想要的; 轉換為 Series 告訴熊貓您要對齊輸入(例如,您不必指定所有元素)
In [6]: import pandas as pd
In [7]: df = pd.DataFrame(columns=['a','b','c','d'], index=['x','y','z'])
In [8]: df.loc['y'] = pd.Series({'a':1, 'b':5, 'c':2, 'd':3})
In [9]: df
Out[9]:
a b c d
x NaN NaN NaN NaN
y 1 5 2 3
z NaN NaN NaN NaN
我的方法是,但我不能保證這是最快的解決方案。
df = pd.DataFrame(columns=["firstname", "lastname"])
df = df.append({
"firstname": "John",
"lastname": "Johny"
}, ignore_index=True)
這是一個更簡單的版本
import pandas as pd
df = pd.DataFrame(columns=('col1', 'col2', 'col3'))
for i in range(5):
df.loc[i] = ['<some value for first>','<some value for second>','<some value for third>']`
如果您的輸入行是列表而不是字典,那么以下是一個簡單的解決方案:
import pandas as pd
list_of_lists = []
list_of_lists.append([1,2,3])
list_of_lists.append([4,5,6])
pd.DataFrame(list_of_lists, columns=['A', 'B', 'C'])
# A B C
# 0 1 2 3
# 1 4 5 6
代碼背后的邏輯非常簡單明了
使用字典制作 1 行的 df
然后創建一個形狀為 (1, 4) 的 df ,它只包含 NaN 並且與字典鍵具有相同的列
然后將一個 nan df 與 dict df 和另一個 nan df 連接起來
import pandas as pd
import numpy as np
raw_datav = {'a':1, 'b':5, 'c':2, 'd':3}
datav_df = pd.DataFrame(raw_datav, index=[0])
nan_df = pd.DataFrame([[np.nan]*4], columns=raw_datav.keys())
df = pd.concat([nan_df, datav_df, nan_df], ignore_index=True)
df.index = ["x", "y", "z"]
print(df)
給
a b c d
x NaN NaN NaN NaN
y 1.0 5.0 2.0 3.0
z NaN NaN NaN NaN
[Program finished]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.