[英]Make new dataframe from existing dataframe with unique values from one column and corresponding values from other columns
[英]Make new column in Panda dataframe by adding values from other columns
我有一個數據框,其值如下
A B
1 4
2 6
3 9
我需要通過添加列 A 和 B 中的值來添加新列,例如
A B C
1 4 5
2 6 8
3 9 12
我相信這可以使用 lambda 函數來完成,但我不知道該怎么做。
很簡單:
df['C'] = df['A'] + df['B']
在 Anton 的答案上再多一點,您可以像這樣添加所有列:
df['sum'] = df[list(df.columns)].sum(axis=1)
最簡單的方法是使用 DeepSpace 答案。 但是,如果你真的想使用匿名函數,你可以使用 apply:
df['C'] = df.apply(lambda row: row['A'] + row['B'], axis=1)
您可以使用sum
函數來實現這一點,正如評論中提到的@EdChum :
df['C'] = df[['A', 'B']].sum(axis=1)
In [245]: df
Out[245]:
A B C
0 1 4 5
1 2 6 8
2 3 9 12
從 Pandas 0.16.0 版開始,您可以按如下方式使用assign
:
df = pd.DataFrame({"A": [1,2,3], "B": [4,6,9]})
df.assign(C = df.A + df.B)
# Out[383]:
# A B C
# 0 1 4 5
# 1 2 6 8
# 2 3 9 12
您可以按如下方式添加多個列:
df.assign(C = df.A + df.B,
Diff = df.B - df.A,
Mult = df.A * df.B)
# Out[379]:
# A B C Diff Mult
# 0 1 4 5 3 4
# 1 2 6 8 4 12
# 2 3 9 12 6 27
你可以這樣做:
df['C'] = df.sum(axis=1)
如果你只想做數值:
df['C'] = df.sum(axis=1, numeric_only=True)
參數axis
將0
或1
作為參數,其中0
表示跨列求和, 1
表示跨行求和。
關於 n00b 的評論:“我收到以下警告:試圖在 DataFrame 的切片副本上設置一個值。嘗試改用 .loc[row_indexer,col_indexer] = value”
我遇到了同樣的錯誤。 就我而言,這是因為我試圖在這樣創建的數據框上執行列添加:
df_b = df[['colA', 'colB', 'colC']]
代替:
df_c = pd.DataFrame(df, columns=['colA', 'colB', 'colC'])
df_b 是 df 切片的副本
df_c 是一個新的數據框。 所以
df_c['colD'] = df['colA'] + df['colB']+ df['colC']
將添加列並且不會引發任何警告。 如果使用 .sum(axis=1) 則相同。
我想添加一條評論來響應 n00b 收到的錯誤消息,但我沒有足夠的聲譽。 所以我的評論是一個答案,以防它幫助任何人......
n00b 說:
我收到以下警告:正在嘗試在 DataFrame 的切片副本上設置值。 嘗試改用 .loc[row_indexer,col_indexer] = value
他得到這個錯誤是因為他在創建df['C']
之前對他的數據框所做的任何操作都創建了一個數據框的視圖而不是它的副本。 DeepSpace 建議的簡單計算df['C'] = df['A'] + df['B']
不會出現錯誤。
查看Returning a view 與 copy docs。
可以使用loc
In [37]: df = pd.DataFrame({"A":[1,2,3],"B":[4,6,9]})
In [38]: df
Out[38]:
A B
0 1 4
1 2 6
2 3 9
In [39]: df['C']=df.loc[:,['A','B']].sum(axis=1)
In [40]: df
Out[40]:
A B C
0 1 4 5
1 2 6 8
2 3 9 12
eval
讓您可以立即求和並創建列:
In [8]: df.eval('C = A + B', inplace=True)
In [9]: df
Out[9]:
A B C
0 1 4 5
1 2 6 8
2 3 9 12
由於inplace=True
您不需要將其分配回df
。
您可以通過簡單地添加來解決它: df['C'] = df['A'] + df['B']
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.