【发布时间】:2021-12-09 18:19:33
【问题描述】:
我有 2 个输入数据帧。
- 数据帧一:
| a1 | a2 |
|---|---|
| A | C |
| B | D |
| F | D |
| A | D |
- 数据帧二:
| emi_1 | emi_2 |
|---|---|
| A | C |
| B | L |
| C | N |
| G | D |
我想要的输出: 我想计算 df1 中 df2 中每个元素的出现次数: 预期输出如下图所示:
注意:如果您根据 IMEI 对最终数据帧进行分组,那么该特定值的所有值都将被分组,这将对读者友好。
【问题讨论】:
标签: python pandas data-science
我有 2 个输入数据帧。
| a1 | a2 |
|---|---|
| A | C |
| B | D |
| F | D |
| A | D |
| emi_1 | emi_2 |
|---|---|
| A | C |
| B | L |
| C | N |
| G | D |
我想要的输出: 我想计算 df1 中 df2 中每个元素的出现次数: 预期输出如下图所示:
注意:如果您根据 IMEI 对最终数据帧进行分组,那么该特定值的所有值都将被分组,这将对读者友好。
【问题讨论】:
标签: python pandas data-science
这里有一个方法,一步一步来
>>> df1
a1 a2
0 A C
1 B D
2 F D
3 A D
>>> df2
emi_1 emi_2
0 A C
1 B L
2 C N
3 G D
>>> df2_melted = df2.melt(var_name="IMEI", value_name="Values")
>>> df2_melted
IMEI Values
0 emi_1 A
1 emi_1 B
2 emi_1 C
3 emi_1 G
4 emi_2 C
5 emi_2 L
6 emi_2 N
7 emi_2 D
>>> df1_counts = df1.apply(pd.Series.value_counts)
>>> df1_counts
a1 a2
A 2.0 NaN
B 1.0 NaN
C NaN 1.0
D NaN 3.0
F 1.0 NaN
>>> final = (
df2_melted.merge(df1_counts, how="left",
left_on="Values", right_index=True)
.fillna(0)
.astype({"a1":int, "a2":int})
)
>>> final
IMEI Values a1 a2
0 emi_1 A 2 0
1 emi_1 B 1 0
2 emi_1 C 0 1
3 emi_1 G 0 0
4 emi_2 C 0 1
5 emi_2 L 0 0
6 emi_2 N 0 0
7 emi_2 D 0 3
【讨论】:
apply,如果df1 没有很多列,这没什么大不了的。