是否有一个函数来转置数据帧,以便为现有列的每个唯一值创建一个单独的列?

2024-09-30 10:41:09 发布

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

我想把我的数据帧改成一种可以用于简单分析的格式。目前,我的数据帧格式如下:

 Carrier | Service | Weight | Area | Charge
   A     |   GRND  |  1     |  2   | $5.0
   A     |   GRND  |  2     |  2   | $6.0
   A     |   GRND  |  3     |  2   | $7.0
   B     |   GRND  |  1     |  2   | $5.5
   B     |   GRND  |  3     |  2   | $6.9

我想将我的数据转换成以下格式:

  Service | Weight | Area | CarrierA_Charge | CarrierB_Charge
   GRND   |  1     |  2   |      $5.0       |   $5.5
   GRND   |  2     |  2   |      $6.0       |   NA
   GRND   |  3     |  2   |      $7.0       |   $6.9

最终,我的目标是创建一个专栏,让我知道每个服务、重量和区域的独特组合的最低费用,如下所示:

  Service | Weight | Area | CarrierA_Charge | CarrierB_Charge | min_charge |min_charge_carrier
   GRND   |  1     |  2   |      $5.0       |   $5.5          |  $5.0      |   A
   GRND   |  2     |  2   |      $6.0       |   NA            |  $6.0      |   A
   GRND   |  3     |  2   |      $7.0       |   $6.9          |  $6.9      |   B

有没有一个内置的pandas函数可以用来实现这一点,或者我如何用python编写一个函数来实现这一点?你知道吗


Tags: 数据函数目标格式serviceareaminweight
3条回答

要完整回答您的问题,包括额外的专栏:

首先,我们创建透视图并相应地重命名列:

步骤1:透视和重命名

pivot = df.pivot_table(index=['Service', 'Weight', 'Area'], 
                       columns='Carrier', 
                       values='Charge', 
                       aggfunc=lambda x: ' '.join(x))

pivot.columns = [pivot.columns.name + col + '_Charge' for col in pivot.columns]
pivot.reset_index(inplace=True)
  Service  Weight  Area CarrierA_Charge CarrierB_Charge
0    GRND       1     2            $5.0            $5.5
1    GRND       2     2            $6.0             NaN
2    GRND       3     2            $7.0            $6.9

步骤2创建额外列:

cols = ['CarrierA_Charge', 'CarrierB_Charge']

for col in cols:
    pivot[col] = pivot[col].str.replace('$', '').astype(float)

pivot['min_charge'] = pivot[['CarrierA_Charge', 'CarrierB_Charge']].min(axis=1)

pivot['min_charge_carrier'] = np.where(pivot['min_charge'].eq(pivot['CarrierA_Charge']), 
                                       'A', 'B')

  Service  Weight  Area  CarrierA_Charge  CarrierB_Charge  min_charge min_charge_carrier
0    GRND       1     2              5.0              5.5         5.0                  A
1    GRND       2     2              6.0              NaN         6.0                  A
2    GRND       3     2              7.0              6.9         6.9                  B

IIUC公司:

d = df.set_index(['Service', 'Weight', 'Area', 'Carrier']).Charge.unstack()
d.rename(columns=f'{d.columns.name}{{}}_Charge'.format) \
 .reset_index().rename_axis(None, axis=1)

  Service  Weight  Area  CarrierA_Charge  CarrierB_Charge
0    GRND       1     2              5.0              5.5
1    GRND       2     2              6.0              NaN
2    GRND       3     2              7.0              6.9

格式和附加列略有不同

d0 = df.set_index(['Service', 'Weight', 'Area', 'Carrier']).Charge.unstack()
d1 = pd.concat(dict(min_charge=d0.min(1), min_charge_carrier=d0.idxmin(1)), axis=1)
fmt = f'{d.columns.name}{{}}_Charge'.format

d0.rename(columns=fmt).join(d1).reset_index().rename_axis(None, axis=1)

  Service  Weight  Area  NoneA_Charge  NoneB_Charge  min_charge min_charge_carrier
0    GRND       1     2           5.0           5.5         5.0                  A
1    GRND       2     2           6.0           NaN         6.0                  A
2    GRND       3     2           7.0           6.9         6.9                  B

数据透视表方法

# pivot table
pivot = df.pivot_table(columns = 'Carrier', index=['Service', 'Weight', 'Area'], values='Charge',
                       aggfunc = np.min).reset_index()

# rename columns here

相关问题 更多 >

    热门问题