在数据帧中将值指定给with条件?

2024-04-28 17:53:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个熊猫数据框,如下所示

df
     time   case1   case2   case3
0     5     house   bank     atm
1     3     bank    house  pharmacy
2     10    bank    bank     atm
3     20    house  pharmacy  house

我想为每个案例添加一列,对应于给定类别的平均值和标准偏差

我知道

p_house = [20, 10]
p_bank =  [5, 1]
p_atm  =  [3, 1]
p_pharmacy = [10, 5]

我想要一个熊猫数据框,如下所示

df
     time   case1   case2   case3          p1      p2       p3
0     5     house   bank     atm        [20, 10] [5, 1]   [3, 1]     
1     3     bank    house  pharmacy      [5, 1] [20, 10]  [10, 5]      
2     10    bank    bank     atm         [5, 1]  [5, 1]   [3, 1]
3     15    house  pharmacy  house      [20, 10][10, 5]   [20, 10] 

Tags: 数据dftime类别案例house平均值bank
3条回答

可以对序列使用map来添加值。我认为这比上面的例子简单

vals = {'house': [20, 10], 'bank':  [5, 1], 'atm': [3, 1], 'pharmacy': [10, 5]}

for idx, col in enumerate(df.columns[1:]):
    df[f'p{idx+1}'] = df[col].map(vals)

您最好定义一个字典,并使用实际值进行查找:

from operator import itemgetter

d = {'house':[20, 10], 'bank':[5, 1], 'atm':[3,1], 'pharmacy':[10,5]}

l = list(zip(*(itemgetter(*l)(d) for l in df.loc[:,'case1':].values)))

for ix,col in enumerate(['p1','p2','p3']):
    df[col] = list(l[ix])

print(df)

   time  case1     case2     case3        p1        p2        p3
0     5  house      bank       atm  [20, 10]    [5, 1]    [3, 1]
1     3   bank     house  pharmacy    [5, 1]  [20, 10]   [10, 5]
2    10   bank      bank       atm    [5, 1]    [5, 1]    [3, 1]
3    20  house  pharmacy     house  [20, 10]   [10, 5]  [20, 10]

IIUC,您可以使用字典,然后使用stackmap,然后沿时间索引重新加入

map_dict = {    'house'  : [20, 10]       
 ,   'bank' :  [5, 1]
 ,   'atm'  :  [3, 1]
 ,   'pharmacy' : [10, 5] }

df1 = df.set_index('time').join(df.set_index("time").stack().map(map_dict).unstack()\
    .rename(
    columns=lambda x: x.replace("case", "p")
    ),how='outer')


      case1     case2     case3        p1        p2        p3
time                                                         
5     house      bank       atm  [20, 10]    [5, 1]    [3, 1]
3      bank     house  pharmacy    [5, 1]  [20, 10]   [10, 5]
10     bank      bank       atm    [5, 1]    [5, 1]    [3, 1]
20    house  pharmacy     house  [20, 10]   [10, 5]  [20, 10]

相关问题 更多 >