我有两个要合并的数据框。第一个是 ~3000 行长,有 3 列:源和目标以及包含多个源和目标组合的卷:
来源 | 目标 | 音量 |
---|---|---|
来源 1 | 目标 1 | 3 |
来源 2 | 目标 2 | 1 |
E
由此,我将源和目标的两个数据框与相应的卷分开。之后,我创建了另一个数据框,将这两个数据框中的数据保存在名为“parts”的单列下。我还根据原始数据框中每个部分的频率及其体积计算了一些值(计数、最小值、平均值、最大值)
部分 | 计数 | 分钟 | 平均 | 最大 |
---|---|---|---|---|
来源 1 | 2 | 3 | 5 | 6 |
目标 1 | 5 | 1 | 5 | 10 |
我想将这两者结合起来,以便根据源和目标从第二个数据框中获取正确的值,然后再结合起来。我想要初始数据框如下:
来源 | 来源计数 | S。分钟 | S。平均 | S。最大 | 目标 | 目标数量 | T。分钟 | T。平均 | T。最大 |
---|---|---|---|---|---|---|---|---|---|
来源 1 | 2 | 3 | 5 | 6 | 目标 1 | 5 | 1 | 5 | 10 |
当我分离源和目标等时,我做的这件事可能比我应该做的更复杂。 有没有一种简单的方法可以按照我想要的方式组合这些数据框?基本上是搜索源和目标的第二个数据框部分列,并将正确的值添加到原始值。
DIT:原始数据框在源列和目标列中可以具有相同的值,应考虑到这一点:
来源 | 目标 | 音量 |
---|---|---|
A | B | 3 |
B | C | 1 |
C | A | 3 |
B | A | 1 |
结果是:
来源 | 来源计数 | S。分钟 | S。平均 | S。最大 | 目标 | 目标数量 | T。分钟 | T。平均 | T。最大 |
---|---|---|---|---|---|---|---|---|---|
A | 3 | 1 | 2.33 | 3 | B | 3 | 1 | 1.66 | 3 |
B | 3 | 1 | 1.66 | 3 | C | 2 | 1 | 2 | 3 |
C | 2 | 1 | 2 | 3 | A | 3 | 1 | 2.33 | 3 |
B | 3 | 1 | 1.66 | 3 | A | 3 | 1 | 2.33 | 3 |
答案 0 :(得分:0)
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
的 Source
合并,然后基于 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'}))