![](/img/trans.png)
[英]Assign value to a column based of other columns from the same pandas dataframe
[英]Assign columns' value from other columns in Pandas dataframe
如果/在哪里滿足條件,我如何將數據框中的列分配為等於另一列?
更新
問題
滿足條件時,我需要分配許多列值(有時是該行另一列的值)。
條件不是問題。
我需要一種有效的方法來做到這一點:
df.loc[some condition it doesn't matter,
['a','b','c','d','e','f','g','x','y']]=df['z'],1,3,4,5,6,7,8,df['p']
簡化的示例數據
d = {'var' : pd.Series([10,61]),
'c' : pd.Series([100,0]),
'z' : pd.Series(['x','x']),
'y' : pd.Series([None,None]),
'x' : pd.Series([None,None])}
df=pd.DataFrame(d)
條件,如果不缺少var並且第一位數字小於5
結果使df.x = df.z&df.y = 1
這是偽代碼,不起作用,但這是我想要的。
df.loc[((df['var'].dropna().astype(str).str[0].astype(int) < 5)),
['x','y']]=df['z'],1
但我明白了
ValueError:無法使用長度與值不同的類似列表的索引器進行設置
理想輸出
c var x z y
0 100 10 x x 1
1 0 61 None x None
下面的代碼有效,但是效率太低,因為我需要將值分配給多列。
df.loc[((df['var'].dropna().astype(str).str[0].astype(int) < 5)),
['x']]=df['z']
df.loc[((df['var'].dropna().astype(str).str[0].astype(int) < 5)),
['y']]=1
這是一種實現方式:
import pandas as pd
import numpy as np
d = {'var' : pd.Series([1,6]),
'c' : pd.Series([100,0]),
'z' : pd.Series(['x','x']),
'y' : pd.Series([None,None]),
'x' : pd.Series([None,None])}
df = pd.DataFrame(d)
# Condition 1: if var is not missing
cond1 = ~df['var'].apply(np.isnan)
# Condition 2: first number is less than 5
cond2 = df['var'].apply(lambda x: int(str(x)[0])) < 5
mask = cond1 & cond2
df.ix[mask, 'x'] = df.ix[mask, 'z']
df.ix[mask, 'y'] = 1
print df
輸出:
c var x y z
0 100 1 x 1 x
1 0 6 None None x
如您所見,布爾掩碼必須應用於賦值的兩側,並且您需要在y
列上廣播值1
。 將步驟分為多行可能更干凈。
已更新問題,請編輯:更一般而言,由於某些分配依賴於其他列,並且某些分配只是沿該列廣播,因此您可以分兩個步驟進行操作:
df.loc[conds, ['a','y']] = df.loc[conds, ['z','p']]
df.loc[conds, ['b','c','d','e','f','g','x']] = [1,3,4,5,6,7,8]
您可以進行分析,看看這對於您的用例是否足夠有效。
您可以按行工作:
def f(row):
if row['var'] is not None and int(str(row['var'])[0]) < 5:
row[['x', 'y']] = row['z'], 1
return row
>>> df.apply(f, axis=1)
c var x y z
0 100 10 x 1 x
1 0 61 None NaN x
要覆蓋原始df,請執行以下操作:
df = df.apply(f, axis=1)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.