R 中merge()函数匹配数据或根据一列或多列来合并两个数据框

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了R 中merge()函数匹配数据或根据一列或多列来合并两个数据框相关的知识,希望对你有一定的参考价值。

参考技术A 写merge()这个函数呢,是因为它可以像excel里面的vlookup的功能,根据信息在某个数据框或矩阵内查找并获取你想要的信息。

准备 authors 的数据框 和 authorN 数据框

结果如下:

结果如下: 其实是以authors为基础,然后合并books数据框的

比如,将两者的位置调换过来,结果会是以books为基础,将authors数据框匹配过来的。

这里的结果就会比上面合并的时候多出来一行,第二行的 R Core ,就是因为根据 books 数据框中的 surname 去匹配 authors 数据框中 name ,没有 R Core ,对应的就会显示NA。 这个有利于我们去匹配一些数据,而不丢失原有的数据框的内容。

根据各个数据框中两列(k1、k2)来匹配两组数据框

有没有办法根据 Python 中的一列或多列中具有相似值的行来选择表中的某些行?

【中文标题】有没有办法根据 Python 中的一列或多列中具有相似值的行来选择表中的某些行?【英文标题】:Is there any way to select certain rows in a table based on which ones have similar values in one or more columns in Python? 【发布时间】:2021-12-04 03:12:35 【问题描述】:
Sr. No. A B C
0 84.3 18.3 1.138420e+00
1 84.3 95.8 8.501307e
2 84.3 192.7 2.262742e-02
3 84.3 617.0 5.395847e-01
4 84.3 54.0 1.484681
5 18.3 95.8 9.612692e-01
6 18.3 192.7 9.600000e-01
7 18.3 617.0 1.706984e
8 18.3 544.0 1.128933e+00
9 95.8 52.7 6.157143e-01
10 95.8 617.0 8.880000e+00
11 95.8 54.0 4.533847e-01
12 192.7 617.0 5.048742e
13 192.7 544.0 1.838478e-02
14 617.0 544.0 7.360492e

例如在上表中,我想从行 0、5、6、7、8 中取 C 值的平均值,因为所有这些行在某些列中都有 18.3。然后我想将此平均值存储在与“18.3”对应的行中的另一个数据框中。 然后,我想从第 1、5、9、10、11 行中取 C 值的平均值,因为所有这些行在某些列中都有 95.8。然后我想将此平均值存储在与“95.8”对应的行中的另一个数据框中。 同样,我想对出现在 A 列和 B 列中的每个唯一值重复此操作。我无法找到执行此操作的方法。任何点击都会有帮助!

【问题讨论】:

【参考方案1】:

试试这个:

import pandas as pd

s = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
a = [84.3, 84.3, 84.3, 84.3, 84.3, 18.3, 18.3, 18.3, 18.3, 95.8, 95.8, 95.8, 192.7, 192.7, 617.0]
b = [18.3, 95.8, 192.7, 617.0, 54.0, 95.8, 192.7, 617.0, 544.0, 52.7, 617.0, 54.0, 617.0, 544.0, 544.0]
c = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150]

df = pd.DataFrame(s, columns=['Sr. No.'])
df['A'] = a
df['B'] = b
df['C'] = c

completeSet = set(list(df['B']) + list(df['A']))
list_df_num = []
list_df_avg = []

for num in completeSet:
    list_df_num.append(num)
    tmp = df[(df['A'] == num) | (df['B'] == num)]
    if len(tmp) > 0:
        avg = sum(list(tmp['C'])) / len(list(tmp['C']))
        list_df_avg.append(avg)
    else:
        list_df_avg.append(0)

result = pd.DataFrame(list_df_num, columns=['Number'])
result['Average'] = list_df_avg

print(result)

【讨论】:

如果有帮助,请接受并投票赞成这个答案 谢谢你,汤姆!你也可以分享一下你是从哪里了解到这些功能的吗?我意识到仅凭 pandas 文档不足以让我想出这样一个完整的解决方案。 究竟哪一部分你不明白?不是这里的每个部分都是熊猫【参考方案2】:

我相信我理解您的要求,您希望将 A 和 B 中每个唯一值的 C 列的平均值存储为新 df 中的一行。

下面的代码读取我创建为 data.csv 的数据框,然后找到 A 和 B 列之间的唯一值,计算 C 的平均值,其中 A 或 B 的行与唯一值匹配。

然后我们创建一个具有均值和唯一值的新数据框。

    import pandas as pd


    df = pd.read_csv("data.csv")


    unique_a = df.A.unique().tolist()
    unique_b = df.B.unique().tolist()
    b_uniques = [ i for  i in unique_b if i not in unique_a]

    unique_a += b_uniques

    output = []
    value = []
    for i in unique_a:
        output.append( df[(df['A']==i) | (df['B']==i)]['C'].mean())
        value.append(i)




    out_df = pd.DataFrame("mean":output, "Group Value": value)


    output:
      mean  Group Value
0  2.336000         84.3
1  1.180000         18.3
2  3.882000         95.8
3  1.512500        192.7
4  4.708000        617.0
5  0.965000         54.0
6  2.836667        544.0
7  0.620000         52.7

【讨论】:

以上是关于R 中merge()函数匹配数据或根据一列或多列来合并两个数据框的主要内容,如果未能解决你的问题,请参考以下文章

pb grid如何隐藏一列或多列

[C#]如何在VS中快速选择一列或多列代码

[C#]如何在VS中快速选择一列或多列代码

SQL Server 一列或多列重复数据的查询,删除

groupby java

R中merge