我有以下数据框
import pandas as pd
dt = pd.DataFrame({'id_resp':[1,2,3,4,1,2],
'country':['a','a','a','a','b','b'],
'variable_1':[0,0,0,0,4,8],
'variable_2': [2, 3, 4, 5, 14, 18],
'variable3': [1, 1, 1, 1, 2, 2]})
我想改变的值variable_1
,并variable_2
为id_resp
s中country
a
那个也是country
b
,随着价值观variable_1
和variable_2
分别的id_resp
是在B国小号
我得到的数据框应该像
dt_f = pd.DataFrame({'id_resp':[1,2,3,4,1,2],
'country':['a','a','a','a','b','b'],
'variable_1':[4,8,0,0,4,8],
'variable_2': [14, 18, 4, 5, 14, 18],
'variable3': [1, 1, 1, 1, 2, 2]})
有没有这样做的pythonic方法(也可以选择variable_1
和variable_2
使用regex
)?
使用DataFrame.merge
与LEFT JOIN ONY过滤行,然后替换由原始的缺失值DataFrame.fillna
,通过获得由最初的原始数据和最后convertm类型的列DataFrame.astype
有DataFrame.dtypes
:
df1 = dt[dt['country'].eq('b')]
df = (dt.merge(df1, on='id_resp', how='left', suffixes=('_',''))
.fillna(dt)[dt.columns]
.astype(dt.dtypes))
print (df)
id_resp country variable_1 variable_2
0 1 b 4 14
1 2 b 8 18
2 3 a 0 4
3 4 a 0 5
4 1 b 4 14
5 2 b 8 18
编辑:如果只想用正则表达式过滤某些列,则可能的解决方案是DataFrame.filter
,也有必要添加id_resp
所选列:
dt = pd.DataFrame({'id_resp':[1,2,3,4,1,2],
'country':['a','a','a','a','b','b'],
'variable_1':[0,0,0,0,4,8],
'variable_2': [2, 3, 4, 5, 14, 18],
'variable3': [1, 1, 1, 1, 2, 2]})
df1 = dt[dt['country'].eq('b')].filter(regex='^variable_|id_resp')
print (df1)
id_resp variable_1 variable_2
4 1 4 14
5 2 8 18
df = (dt.merge(df1, on='id_resp', how='left', suffixes=('_',''))
.fillna(dt)[dt.columns]
.astype(dt.dtypes))
print (df)
id_resp country variable_1 variable_2 variable3
0 1 a 4 14 1
1 2 a 8 18 1
2 3 a 0 4 1
3 4 a 0 5 1
4 1 b 4 14 2
5 2 b 8 18 2
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句