2015-01-26 89 views
2

如何滿足條件時,我如何將數據框中的列分配爲等於另一列?從Pandas數據框中的其他列中分配列的值

更新
問題
我要當條件滿足指定的列值(有時是從該行另一列的值)。

條件不是問題。

我需要一個有效的方式來做到這一點:

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) 

條件如果無功是不是失蹤,第一個數字是小於5
結果 make 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 
+0

的dropna是行不通的 - 你的布爾指標需要有相同的長度數據幀 – Noah 2015-01-27 00:43:27

回答

1

您可以變通行明智:

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) 
+0

當我嘗試你的解決方案時,它保持示例df不變。 – 7stud 2015-01-27 03:35:54

+0

'NameError:(「全局名稱'條件'未定義''。當條件失敗時,包括實際條件會導致垃圾回收 – 7stud 2015-01-27 03:59:41

+0

這是一個示例,您需要根據行定義條件,例如:'條件= int(str(行['x'])[0])<5' – elyase 2015-01-27 05:34:49

2

這是做這件事的一種方法:

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] 

您可以配置文件和看看這對你的用例是否足夠有效。

+0

我的問題更多地是關於如何將賦值合併到一行代碼中,因爲當條件滿足時我需要分配10個變量不同的值。 – 2015-01-27 00:55:08

+0

您能否詳細說明10個具有不同值的變量部分? dict + loop方法能解決問題嗎? – 2015-01-27 01:01:52

+0

我更新了我的問題。感謝您的反饋意見。 – 2015-01-27 01:11:57

相關問題