使用查找数据框替换数据框中的值
Replace Values in Dataframe using a Lookup Dataframe
我想使用 lookup 数据帧替换 df 数据帧中的值。
import pandas as pd
df=pd.DataFrame({
'no1':[20,20,40,10,50],
'no2':[50,20,10,40,50],
'no3':[30,10,50,40,50]
})
no1 no2 no3
0 20 50 30
1 20 20 10
2 40 10 50
3 10 40 40
4 50 50 50
lookup=pd.DataFrame({'label':['A','B','C','D','E'],
'id':[10,20,30,40,50]})
label id
0 A 10
1 B 20
2 C 30
3 D 40
4 E 50
特别是,我想要:
no1 no2 no3
0 B E C
1 B B A
2 D A E
3 A D D
4 E E E
使用 pandas 的最佳方法是什么?
P.S.: 我在这里找到了一个非常相似的 ,但我不太了解它在 R 中的用法。感谢 Python 解决方案。
首先由 set_index
创建 Series
。
使用replace
,但是大的应该比较慢DataFrame
:
s = lookup.set_index('id')['label']
df = df.replace(s)
None
或 NaN
与 applymap
or apply
with map
不匹配值的解决方案:
df = df.applymap(s.get)
或者:
df = df.apply(lambda x: x.map(s))
或者:
for c in df.columns:
df[c] = df[c].map(s)
print (df)
no1 no2 no3
0 B E C
1 B B A
2 D A E
3 A D D
4 E E E
您可以将 replace 与字典一起使用:
import pandas as pd
df=pd.DataFrame({
'no1':[20,20,40,10,50],
'no2':[50,20,10,40,50],
'no3':[30,10,50,40,50]
})
lookup=pd.DataFrame({'label':['A','B','C','D','E'],
'id':[10,20,30,40,50]})
result = df.replace(dict(zip(lookup.id, lookup.label)))
print(result)
输出
no1 no2 no3
0 B E C
1 B B A
2 D A E
3 A D D
4 E E E
你可以构造一个字典然后使用np.vectorize
:
d = lookup.set_index('id')['label'].to_dict() # or d = dict(np.fliplr(lookup.values))
df.iloc[:] = np.vectorize(d.get)(df.values)
print(df)
no1 no2 no3
0 B E C
1 B B A
2 D A E
3 A D D
4 E E E
我想使用 lookup 数据帧替换 df 数据帧中的值。
import pandas as pd
df=pd.DataFrame({
'no1':[20,20,40,10,50],
'no2':[50,20,10,40,50],
'no3':[30,10,50,40,50]
})
no1 no2 no3
0 20 50 30
1 20 20 10
2 40 10 50
3 10 40 40
4 50 50 50
lookup=pd.DataFrame({'label':['A','B','C','D','E'],
'id':[10,20,30,40,50]})
label id
0 A 10
1 B 20
2 C 30
3 D 40
4 E 50
特别是,我想要:
no1 no2 no3
0 B E C
1 B B A
2 D A E
3 A D D
4 E E E
使用 pandas 的最佳方法是什么?
P.S.: 我在这里找到了一个非常相似的
首先由 set_index
创建 Series
。
使用replace
,但是大的应该比较慢DataFrame
:
s = lookup.set_index('id')['label']
df = df.replace(s)
None
或 NaN
与 applymap
or apply
with map
不匹配值的解决方案:
df = df.applymap(s.get)
或者:
df = df.apply(lambda x: x.map(s))
或者:
for c in df.columns:
df[c] = df[c].map(s)
print (df)
no1 no2 no3
0 B E C
1 B B A
2 D A E
3 A D D
4 E E E
您可以将 replace 与字典一起使用:
import pandas as pd
df=pd.DataFrame({
'no1':[20,20,40,10,50],
'no2':[50,20,10,40,50],
'no3':[30,10,50,40,50]
})
lookup=pd.DataFrame({'label':['A','B','C','D','E'],
'id':[10,20,30,40,50]})
result = df.replace(dict(zip(lookup.id, lookup.label)))
print(result)
输出
no1 no2 no3
0 B E C
1 B B A
2 D A E
3 A D D
4 E E E
你可以构造一个字典然后使用np.vectorize
:
d = lookup.set_index('id')['label'].to_dict() # or d = dict(np.fliplr(lookup.values))
df.iloc[:] = np.vectorize(d.get)(df.values)
print(df)
no1 no2 no3
0 B E C
1 B B A
2 D A E
3 A D D
4 E E E