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()函数匹配数据或根据一列或多列来合并两个数据框的主要内容,如果未能解决你的问题,请参考以下文章