【问题标题】:Merge dataframes including extreme values合并包含极值的数据框
【发布时间】:2018-11-08 14:17:22
【问题描述】:

我有 2 个数据框,df1 和 df2:

df1
Out[66]: 
    A   B
0   1  11
1   1   2
2   1  32
3   1  42
4   1  54
5   1  66
6   2  16
7   2  23
8   3  13
9   3  24
10  3  35
11  3  46
12  3  51
13  4  12
14  4  28
15  4  39
16  4  49

df2
Out[80]: 
    B
0  32
1  42
2  13
3  24
4  35
5  39
6  49

我想合并数据框,但同时包括 A 列中集合的第一个和/或最后一个值。这是期望结果的一个示例:

df3
Out[93]: 
    A   B
0   1   2
1   1  32
2   1  42
3   1  54
4   3  13
5   3  24
6   3  35
7   3  46
8   4  28
9   4  39
10  4  49

我正在尝试使用merge,但这只会分割数据帧中重合的部分。有人有解决这个问题的想法吗?谢谢!

【问题讨论】:

  • 第一个/最后一个意思是 max 和 min ?我不明白为什么 2 和 54 会出现在 df3 中
  • 如果A列中的数字相同,我指的是立即上排和下排
  • 好的,我明白了,我会尝试一些东西...到目前为止你尝试了什么?
  • 索引 7 A=2 B=23 是否应该成为结果的一部分,因为索引 8 B=13 在列表中?
  • 我首先合并两个数据框df1.merge(df2) 然后我试图通过unique() 获取我需要切片的列 A 的数字在这里我只能考虑找到 df2.B在 df1 旁边并尝试使用位置 +1 和 -1 进行斩波但是这不能继续使用相同数量的 A 列

标签: python pandas dataframe merge


【解决方案1】:
 pd.concat([df1.groupby('A').min().reset_index(), pd.merge(df1,df2, on="B"), df1.groupby('A').max().reset_index()]).reset_index(drop=True).drop_duplicates().sort_values(['A','B'])
    A   B
0   1   2
4   1  32
5   1  42
1   2  16
2   3  13
7   3  24
8   3  35
3   4  12
9   4  39
10  4  49

分解每个部分

#Get Minimum
df1.groupby('A').min().reset_index()

# Merge on B
pd.merge(df1,df2, on="B")

# Get Maximum
df1.groupby('A').max().reset_index()

# Reset the Index and drop duplicated rows since there may be similarities between the Merge and Min/Max. Sort values by 'A' then by 'B'
.reset_index(drop=True).drop_duplicates().sort_values(['A','B'])

【讨论】:

    【解决方案2】:

    这是使用带有指示器的mergegroupbyrolling 的一种方法:

    df[df.merge(df2, on='B', how='left', indicator='Ind').eval('Found=Ind == "both"')
         .groupby('A')['Found']
         .apply(lambda x: x.rolling(3, center=True, min_periods=2).max()).astype(bool)]
    

    输出:

        A   B
    1   1   2
    2   1  32
    3   1  42
    4   1  54
    8   3  13
    9   3  24
    10  3  35
    11  3  46
    14  4  28
    15  4  39
    16  4  49
    

    【讨论】:

    • @JonathanPacheco 这是一种有趣的做法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多