我在字典中有一些数据和pandas数据框如:
s_dict = {('A1','B1'):100, ('A3','B3'):300}
df = pd.DataFrame(data={'A': ['A1', 'A2'], 'B': ['B1', 'B2'],
'C': ['C1', 'C2'], 'count':[1,2]})
# A B C count
#0 A1 B1 C1 1
#1 A2 B2 C2 2
我想替换" df"的计数列如果数据存在于s_dict中。所以我想要跟随输出:
# A B C count
#0 A1 B1 C1 100
#1 A2 B2 C2 2
答案 0 :(得分:3)
您可以使用:
df['count'] = df[['A', 'B']].apply(tuple, axis=1).map(s_dict).fillna(df['count'])
apply(tuple, axis=1)
创建相关列的元组'值。map(s_dict)
将元组映射到s_dict
。fillna(df['count'])
使用count
。答案 1 :(得分:1)
以下是使用zip()
的一种方式,通常比.apply()
快。
import pandas as pd
s_dict = {('A1','B1'):100, ('A3','B3'):300}
df = pd.DataFrame(data={'A': ['A1', 'A2'], 'B': ['B1', 'B2'],
'C': ['C1', 'C2'], 'count':[1,2]})
# Create a map
m = pd.Series(list(zip(df['A'],df['B']))).map(s_dict).dropna()
# Assign to the index that are not nan
df.loc[m.index, 'count'] = m
通过使用您可以执行的列值填充na来启发: (似乎是最快的)
df['count'] = pd.Series(list(zip(df['A'],df['B']))).map(s_dict).fillna(df['count'])
<强>计时强>
df['count'] = pd.Series(list(zip(df['A'],df['B']))).map(s_dict).fillna(df['count'])
# 1.52 ms ± 85.9 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
df['count'] = df[['A', 'B']].apply(tuple, axis=1).map(s_dict).fillna(df['count'])
# 1.88 ms ± 100 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
dropna and loc (2 row-operation above)
# 1.93 ms ± 55.6 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)