【问题标题】:How do I make a Dataframe of columns and unique values stacked?如何制作堆叠的列和唯一值的数据框?
【发布时间】:2019-04-14 10:04:21
【问题描述】:

我有一个大数据框,我想从中开发一个汇总表。换句话说,第 1 列将是第一个数据帧的列,第 2 列将是每列的每个唯一值,第 3 列到第 3 列将是我选择的不同变量的总和。像下面这样:

Variable   Level   Summed_Column

这里是一些示例代码:

data = {"name": ['bob', 'john', 'mary', 'timmy']
       , "age": [32, 32, 29, 28]
       , "location": ['philly', 'philly', 'philly', 'ny']
       , "amt": [100, 2000, 300, 40]}

df = pd.DataFrame(data)

df.head()

所以上例中的输出如下:

Variable     Level     Summed_Column
Name         Bob       100
Name         john      2000
Name         Mary      300
Name         timmy     40
age          32        2100
age          29        300
age          29        40
location     philly    2400
location     ny        40

我什至不知道从哪里开始。实际的数据框有 32 列,其中 4 列相加,28 列放入 variableLevel 格式。

【问题讨论】:

  • 你看过pd.melt吗?不是 100% 确定,但它可以在这里使用
  • 感谢@Datanovice。我试过pd.melt,但它似乎重复了值。我需要每个变量的唯一值和其他列的总和。

标签: pandas data-manipulation


【解决方案1】:

您不需要为此和连接使用循环,您可以通过将meltgroupby 组合并使用agg 方法一次性完成:

final = df.melt(value_vars=['name', 'age', 'location'], id_vars='amt')\
          .groupby(['variable', 'value']).agg({'amt':'sum'})\
          .reset_index()

产量:

print(final)
   variable   value   amt
0       age      28    40
1       age      29   300
2       age      32  2100
3  location      ny    40
4  location  philly  2400
5      name     bob   100
6      name    john  2000
7      name    mary   300
8      name   timmy    40

【讨论】:

  • 是的,这样干净多了。谢谢。
【解决方案2】:

好的@Datanovice。我想出了如何使用带有pd.melt的for循环来做到这一点。

id = ['name', 'age', 'location']

final = pd.DataFrame(columns = ['variable', 'value', 'amt'])

for i in id:
    table = df.groupby(i).agg({'amt':'sum'}).reset_index()
    table2 = pd.melt(table, value_vars = i, id_vars = ['amt'])
    final = pd.concat([final, table2])

print(final)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多