【问题标题】:Pandas: pivot_table熊猫:数据透视表
【发布时间】:2023-01-11 19:03:03
【问题描述】:

假设我有这样一个数据框:

data = [
    {'column1': 'asd', 'column2': 'a', 'column3': 'mileage', 'column4': 7889, 'column5': None},
    {'column1': 'fsd', 'column2': 'a', 'column3': 'temp', 'column4': 4557, 'column5': None},
    {'column1': None, 'column2': 'a', 'column3': 'string', 'column4': None, 'column5': 'value_string1'},
    {'column1': 'asd', 'column2': 'b', 'column3': 'mileage', 'column4': 5678, 'column5': None},
    {'column1': 'fsd', 'column2': 'b', 'column3': 'temp', 'column4': 5830, 'column5': None},
    {'column1': None, 'column2': 'b', 'column3': 'string', 'column4': None, 'column5': 'value_string2'},
    {'column1': None, 'column2': 'c', 'column3': 'temp', 'column4': 10, 'column5': None},
    {'column1': None, 'column2': 'c', 'column3': 'temp', 'column4': 8, 'column5': None},

]

df = pd.DataFrame(data)

    column1 column2 column3 column4 column5
0   asd       a      mileage 7889.0  None
1   fsd       a        temp  4557.0  None
2   None      a       string  NaN  value_string1
3   asd       b       mileage 5678.0 None
4   fsd       b        temp   5830.0 None
5   None      b       string  NaN  value_string2
6   None      c        temp   10.0   None
7   None      c        temp   8.0    None

我想将此数据框转换为:

        
column2 mileage temp_1  temp_2  
a       7889.0  4557.0  NaN
b       5678.0  5830.0  NaN
c        NaN    10.0    NaN
c        NaN     Nan    8.0

我尝试使用 pandas 函数“pivot_table”

pivot_table = df.pivot_table(index='column2', columns='column3', values='column4')

但结果是

column3 mileage temp
column2     
a       7889.0  4557.0
b       5678.0  5830.0
c         NaN    9.0

所以这个函数结合了第 2 列的相等值,但如果它们在第 3 列也有相同的值,则第 4 列中的值将是原始表中值的平均值。

有没有办法修改这个函数以获得我想要的结果?或者还有另一种方法吗?

【问题讨论】:

  • 你如何决定哪个 temp 变成 temp_1 还是 temp_2
  • 按命令。如果我们有两行“column2”和“column3”相等,那么我们将有 temp_1 和第一行的值以及 temp_2 和第二行的值。另一种可能性是新表没有 temp_2 但有两行:c NaN 10.0c NaN 8.0 所以没有 temp_2 列

标签: python-3.x pandas dataframe pivot-table


【解决方案1】:

这不完全是你想要的,但看看:

>>> (df.loc[df['column4'].notna(), ['column2', 'column3', 'column4']]
       .assign(index=lambda x: x.groupby('column3').cumcount())
       .pivot_table(index=['index', 'column2'], columns='column3', values='column4')
       .reset_index('column2').rename_axis(index=None, columns=None))

  column2  mileage    temp
0       a   7889.0  4557.0
1       b   5678.0  5830.0
2       c      NaN    10.0
3       c      NaN     8.0

【讨论】:

    猜你喜欢
    • 2021-02-28
    • 2017-01-14
    • 2019-04-28
    • 2012-04-15
    • 1970-01-01
    • 1970-01-01
    • 2018-12-21
    • 1970-01-01
    相关资源
    最近更新 更多