我想根据基于同一数据框的两个不同列的行条件添加新列。
我有以下Dataframe -
df1_data = {'e_id': {0:'101',1:'',2:'103',3:'',4:'105',5:'',6:''},
'r_id': {0:'',1:'502',2:'',3:'504',4:'',5:'506',6:''}}
df=pd.DataFrame(df1_data)
print df
我想添加名为“sym”的新列。
条件-
- 如果“e_id”列值不为空,则 sym 列值为“e_id”列值。
- 如果“r_id”列值不为空,则 sym 列值为“r_id”列值。
- 如果“e_id”和“r_id”的两个列值都为空,则从 pandas 数据框中删除该特定行。
我尝试使用以下代码 -
df1_data = {'e_id': {0:'101',1:'',2:'103',3:'',4:'105',5:''},
'r_id': {0:'',1:'502',2:'',3:'504',4:'',5:'506'}}
df=pd.DataFrame(df1_data)
print df
if df['e_id'].any():
df['sym'] = df['e_id']
print df
if df['r_id'].any():
df['sym'] = df['r_id']
print df
但它给了我一个错误的输出。
预期输出 -
e_id r_id sym
0 101 101
1 502 502
2 103 103
3 504 504
4 105 105
5 506 506
最佳答案
Pandas
使用 mask
+ fillna
+ assign
d1 = df.mask(df == '')
df.assign(sym=d1.e_id.fillna(d1.r_id)).dropna(subset=['sym'])
e_id r_id sym
0 101 101
1 502 502
2 103 103
3 504 504
4 105 105
5 506 506
它是如何工作的
- 我需要掩盖你的
''
值,假设你的意思是这些值是空的 - 通过使用
fillna
如果e_id
不为 null,我取r_id
如果它不为 null,则取r_id
dropna
withsubset=['sym']
仅在新列为 null 时才删除该行,并且只有在e_id
时才为 null > 和r_id
为空
numpy
使用 np.where
+ assign
e = df.e_id.values
r = df.r_id.values
df.assign(
sym=np.where(
e != '', e,
np.where(r != '', r, np.nan)
)
).dropna(subset=['sym'])
e_id r_id sym
0 101 101
1 502 502
2 103 103
3 504 504
4 105 105
5 506 506
numpy
v2
从值重建数据框
v = df.values
m = (v != '').any(1)
v = v[m]
c1 = v[:, 0]
c2 = v[:, 1]
pd.DataFrame(
np.column_stack([v, np.where(c1 != '', c1, c2)]),
df.index[m], df.columns.tolist() + ['sym']
)
e_id r_id sym
0 101 101
1 502 502
2 103 103
3 504 504
4 105 105
5 506 506
时间
%%timeit
e = df.e_id.values
r = df.r_id.values
df.assign(sym=np.where(e != '', e, np.where(r != '', r, np.nan))).dropna(subset=['sym'])
1000 loops, best of 3: 1.23 ms per loop
%%timeit
d1 = df.mask(df == '')
df.assign(sym=d1.e_id.fillna(d1.r_id)).dropna(subset=['sym'])
100 loops, best of 3: 2.44 ms per loop
%%timeit
v = df.values
m = (v != '').any(1)
v = v[m]
c1 = v[:, 0]
c2 = v[:, 1]
pd.DataFrame(
np.column_stack([v, np.where(c1 != '', c1, c2)]),
df.index[m], df.columns.tolist() + ['sym']
)
1000 loops, best of 3: 204 µs per loop
关于python - 如何根据 Pandas 数据框中的行条件添加新列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43752187/