Python 如何根据数据帧中的行条件添加新列?
我想根据行条件添加新列,行条件基于相同数据帧的两个不同列 我有以下数据帧-Python 如何根据数据帧中的行条件添加新列?,python,pandas,dataframe,Python,Pandas,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”
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”的新列
条件-
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
熊猫
使用
mask
+fillna
+assign
它的工作原理
%%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
- 我需要用你的意思是空的假设来掩盖你的
值'
- 通过使用
I获取fillna
如果它不为空,否则获取e\u id
如果它不为空r\u id
withdropna
仅当新列为空时才会删除行,而只有subset=['sym']
和e\u id
都为空时才会删除行r\u id
numpy
使用
np.where
+assign
numpy
v2从值重构数据帧
定时
%%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
熊猫
使用
mask
+fillna
+assign
它的工作原理
%%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
- 我需要用你的意思是空的假设来掩盖你的
值'
- 通过使用
I获取fillna
如果它不为空,否则获取e\u id
如果它不为空r\u id
withdropna
仅当新列为空时才会删除行,而只有subset=['sym']
和e\u id
都为空时才会删除行r\u id
numpy
使用
np.where
+assign
numpy
v2从值重构数据帧
定时
%%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
首先,使用以下方法筛选两个空列: 然后与以下内容一起使用: Numpy解决方案,带过滤和:
首先,使用以下方法筛选两个空列: 然后与以下内容一起使用: Numpy解决方案,带过滤和:
使用
pandas.DataFrame.mask
和'other'
参数,可以从列“e\u id”开始,在“e\u id”为“空”时用“r\u id”值替换其值:
df['sym'] = df['e_id'].mask(df['e_id'] == '', other=df['r_id'], axis=0)
然后您只需要删除sym
为“空”的行
使用
pandas.DataFrame.mask
和'other'
参数,可以从列“e\u id”开始,在“e\u id”为“空”时用“r\u id”值替换其值:
df['sym'] = df['e_id'].mask(df['e_id'] == '', other=df['r_id'], axis=0)
然后您只需要删除sym
为“空”的行
@jezrael-我面临类型错误:无法将['']与df=df[(df!='')中的块值错误进行比较。任何(1)]行,但您的替代解决方案工作正常。;-)好的,没问题。顺便说一句,替代解决方案更快;)@jezrael-我面临类型错误:无法将['']与df=df[(df!='')中的块值错误进行比较。任何(1)]行,但您的替代解决方案工作正常。;-)好的,没问题。顺便说一句,替代解决方案更快;)
df = df[(df['e_id'] != '') | (df['r_id'] != '')]
e_id = df.e_id.values
r_id = df.r_id.values
df['sym'] = np.where(e_id != '', e_id, 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
df['sym'] = df['e_id'].mask(df['e_id'] == '', other=df['r_id'], axis=0)
df = df[df.sym!='']