【问题标题】: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?有没有办法根据 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 列中的每个唯一值重复此操作。我无法找到执行此操作的方法。任何点击都会有帮助!

【问题讨论】:

    标签: python pandas dataframe lambda pandas-groupby


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-29
      • 1970-01-01
      相关资源
      最近更新 更多