python - Pandas 从另一个数据框中查找值
问题描述
我有两个要合并的数据框。第一个是约 3000 行长,有 3 列:源和目标以及包含多个源和目标组合的卷:
来源 | 目标 | 体积 |
---|---|---|
来源 1 | 目标1 | 3 |
来源 2 | 目标 2 | 1 |
乙
从这里我已经为源和目标分离了两个数据框以及相应的卷。之后,我创建了另一个数据框来将这两个数据框中的数据存放在称为部件的单列下。我还根据每个部分的频率及其在原始数据框中的体积计算了一些值(计数、最小值、平均值、最大值)
部分 | 数数 | 分钟 | 意思是 | 最大限度 |
---|---|---|---|---|
来源 1 | 2 | 3 | 5 | 6 |
目标1 | 5 | 1 | 5 | 10 |
我想将这两者结合起来,以便根据源和目标从第二个数据帧中获取正确的值,然后再结合。我希望初始数据框如下:
来源 | 源数 | 最小 | S. 平均 | S. 最大 | 目标 | 目标计数 | T. 分钟 | T. 平均 | T. 最大值 |
---|---|---|---|---|---|---|---|---|---|
来源 1 | 2 | 3 | 5 | 6 | 目标1 | 5 | 1 | 5 | 10 |
当我分离源和目标等时,我可能做的比我应该做的更复杂。有没有一种简单的方法可以按照我想要的方式组合这些数据帧?基本上是在第二个数据框部分列中搜索源和目标,并将正确的值添加到原始值。
DIT:原始数据框在源列和目标列中可以具有相同的值,应考虑到这一点:
来源 | 目标 | 体积 |
---|---|---|
一种 | 乙 | 3 |
乙 | C | 1 |
C | 一种 | 3 |
乙 | 一种 | 1 |
结果将是:
来源 | 源数 | 最小 | S. 平均 | S. 最大 | 目标 | 目标计数 | T. 分钟 | T. 平均 | T. 最大值 |
---|---|---|---|---|---|---|---|---|---|
一种 | 3 | 1 | 2.33 | 3 | 乙 | 3 | 1 | 1.66 | 3 |
乙 | 3 | 1 | 1.66 | 3 | C | 2 | 1 | 2 | 3 |
C | 2 | 1 | 2 | 3 | 一种 | 3 | 1 | 2.33 | 3 |
乙 | 3 | 1 | 1.66 | 3 | 一种 | 3 | 1 | 2.33 | 3 |
解决方案
df
Source Target volume
0 A B 3
1 B C 1
2 C A 3
3 B A 1
由于所有计算都必须独立于Source
,来完成Target
。因此,对于计算,最好将其视为同一列。所以,垂直连接Source-Volume
表格和Target-Volume
表格
temp_df = pd.concat([df[['Source', 'volume']].rename(columns={'Source': 'Source_Target'}),
df[['Target', 'volume']].rename(columns={'Target': 'Source_Target'})], ignore_index=True)
temp_df
Source_Target volume
0 A 3
1 B 1
2 C 3
3 B 1
4 B 3
5 C 1
6 A 3
7 A 1
现在,您可以使用groupby
和agg
temp_df = temp_df.groupby('Source_Target')['volume'].agg(
count = 'count',
min = 'min',
mean = 'mean',
max = 'max'
)
temp_df
最后,df
与temp_df
based on合并,Source
然后 based on Target
。
(df
.drop('volume', axis=1)
.merge(temp_df, left_on='Source', right_on='Source_Target', how='left') # 'left' to retain order
.reindex(['Source', 'count', 'min', 'mean', 'max', 'Target'], axis=1)
.rename(columns={'count': 'Source count', 'min': 'S .min', 'max': 'S .max', 'mean': 'S .mean'})
.merge(temp_df, left_on='Target', right_on='Source_Target', how='left')
.rename(columns={'count': 'Target count', 'min': 'T .min', 'max': 'T .max', 'mean': 'T .mean'}))