【问题标题】:Adding a new column based on other columns and rows基于其他列和行添加新列
【发布时间】:2020-08-23 23:03:19
【问题描述】:

我有一个大数据框。让我写一个示例数据框,让您理解我的问题。

A      B      C     
car    red    15
car    blue   20
car    grey   14
bike   red    6
bike   blue   8
phone  red    9
phone  blue   11
phone  grey   10

假设 C 列显示价格。我想添加一个名为“D”的列。此列将回答“读取的汽车是否比所有汽车的平均价格贵?”。对于其他 A 值,同样的问题。我的问题基本上是这样的。我想看看这个:

A      B      C    D    
car    red    15   cheap
car    blue   20   expensive
car    grey   14   cheap
bike   red    6    cheap
bike   blue   8    expensive
phone  red    9    cheap
phone  blue   11   expensive
phone  grey   10   cheap

我写了太多方法来完成这项任务。最后我认为这段代码可以解决我的问题,但它没有。我用 While 循环尝试了同样的事情,但我不断收到 Key Error 0。我该怎么办?这是我尝试过的代码:

df["D"] = "cheap"
A.values = df.A.unique()
for b in A.values:
    for i in range(len(df.loc[data.A== b])):
        if df.loc[df.A== b, "C"][i] >= df.loc[df.A== b, "C"].mean():
            df.loc[df.A== b, "D"][i] = "expensive"

【问题讨论】:

    标签: python pandas numpy dataframe keyerror


    【解决方案1】:

    检查transformmean,然后使用np.where

    s = df.groupby('A').C.transform('mean')
    df['D'] = np.where(df.C>s, 'expensive', 'cheap')
    df
    Out[158]: 
           A     B   C          D
    0    car   red  15      cheap
    1    car  blue  20  expensive
    2    car  grey  14      cheap
    3   bike   red   6      cheap
    4   bike  blue   8  expensive
    5  phone   red   9      cheap
    6  phone  blue  11  expensive
    7  phone  grey  10      cheap
    

    【讨论】:

    • 嘿,BEN_YO,这真的解决了我的问题。如果你不介意,我还有一个问题。如何使用 %95 置信区间而不是平均价格来做同样的事情?您在代码中使用了 transform.("mean"),对于超出置信区间的值是否有类似的情况?
    【解决方案2】:
    df['D']=np.where(df[['A', 'B', 'C']].groupby('A').apply(lambda x: (x['C'].mean()>=x['C'])),'cheap','expensive')
    
    
         A     B   C          D
    0    car   red  15      cheap
    1    car  blue  20  expensive
    2    car  grey  14      cheap
    3   bike   red   6  expensive
    4   bike  blue   8      cheap
    5  phone   red   9      cheap
    6  phone  blue  11  expensive
    7  phone  grey  10      cheap
    

    工作原理

    np.where(condition, if met answer, not met answer)
    
    
    #Apply boolean select to get condition. In this statement we seek to return true if mean is greater than price
    
    condition= df[['A', 'B', 'C']].groupby('A').apply(lambda x: (x['C'].mean()>=x['C']))
    
    
    if met answer= 'cheap'
    
    not me t answer='expensive'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-12
      • 1970-01-01
      • 2017-10-06
      • 2017-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多