熊猫从另一个数据框中查找值

时间:2021-01-12 13:42:11

标签: python pandas

我有两个要合并的数据框。第一个是 ~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

1 个答案:

答案 0 :(得分:0)

df
    Source  Target  volume
0   A       B       3
1   B       C       1
2   C       A       3
3   B       A       1

因为所有计算都必须独立于 SourceTarget。因此,对于计算,最好将其作为同一列。所以,垂直连接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

现在,您可以使用 groupbyagg

获得所有计算结果
temp_df = temp_df.groupby('Source_Target')['volume'].agg(
    count = 'count',
    min = 'min',
    mean = 'mean',
    max = 'max'
)
temp_df

enter image description here

最后,将 df 与基于 temp_dfSource 合并,然后基于 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'}))

enter image description here