[英]Adding a list to two columns of a dataframe in Pandas?
我有以下代碼。
import pandas as pd
def generate_list(row):
return [row['A']*2, row['B']*3]
def main():
data = {
'A':[0, 2, 3],
'B':[4, 15, 6]}
df = pd.DataFrame(data)
# applying function to each row in
df['C'], df['D'] = df.apply(lambda row: generate_list(row), axis=1)
if __name__ == '__main__':
main()
該代碼只是將 function 應用於我的 df 的每一行,並將結果作為列表返回。 我正在嘗試將返回列表的每個元素添加到兩個新列中。 但是,我收到以下錯誤:
df['C'], df['D'] = df.apply(lambda row: generate_list(row), axis=1)
ValueError: too many values to unpack (expected 2)
代替:
df['C'], df['D'] = df.apply(lambda row: generate_list(row), axis=1)
和:
df[['C','D']] = pd.DataFrame(df.apply(lambda row: generate_list(row), axis=1).tolist(), index= df.index)
return df
給你:
A B C D
0 0 4 0 12
1 2 15 4 45
2 3 6 6 18
因為apply()
function 不能返回一個列表或元組,它只返回一個Series
或一個DataFrame
,所以當你只添加一個新列但不添加多個新列時是可以的。 為了您的目的,您可以像這樣使用concat
function :
import pandas as pd
def generate_list(row):
return [row['A']*2, row['B']*3]
def main():
data = {
'A':[0, 2, 3],
'B':[4, 15, 6]}
df = pd.DataFrame(data)
# applying function to each row in
df = pd.concat([df, df.apply(lambda row: generate_list(row), axis=1, result_type='expand').rename(columns={0:'C',1:'D'})],axis=1)
print(df)
if __name__ == '__main__':
main()
上面代碼的結果是:
A B C D
0 0 4 0 12
1 2 15 4 45
2 3 6 6 18
那是你要的嗎?
我嘗試了一些實驗,例如:
data = {'A':[0, 2, 3],
'B':[4, 15, 6]}
df = pd.DataFrame(data)
def generate_list(row):
return [row['A']*2, row['B']*3]
obj = df.apply(lambda row: generate_list(row), axis=1)
0 [0.0, 12.0]
1 [4.0, 45.0]
2 [6.0, 18.0]
dtype: object
obj_accept = np.array(obj.sum()).reshape(-1,2)
array([[ 0., 12.],
[ 4., 45.],
[ 6., 18.]])
# it's worked
df[['C', 'D']] = obj_accept
# also work
df[['C', 'D']] = np.array(obj.tolist())
# also work
df[['C', 'D']] = obj.tolist()
# not worked
df[['C', 'D']] = obj
形狀:
obj.values.shape # (3,)
df[['C', 'D']].shape # (3, 2)
np.array(obj.tolist()).shape # (3, 2)
一些奇怪的結果:
df = pd.DataFrame({'A':[0, 2, 3], 'B':[4, 15, 6]} )
df.loc[:1, ['C', 'D']] = obj.loc[:1]
print(obj.loc[:1])
0 [0.0, 12.0]
1 [4.0, 45.0]
dtype: object
print(df)
A B C D
0 0 4 0.0 4.0
1 2 15 12.0 45.0
2 3 6 NaN NaN
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.