【问题标题】:Having issue summarising python dataframe to one line per record将python数据框总结为每条记录一行时出现问题
【发布时间】:2016-09-06 18:36:17
【问题描述】:

我有一个表单中的数据框:

df = pd.DataFrame({'id':['a', 'a', 'a', 'b','b'],'var':[1,2,3,5,9]})

我正在尝试重塑它,以便每个 'id' 有一行,并且值 'var' 显示在一行中,因此 'a' 将具有 1,2,3 ...'b ' 将有 '5,9'

我试过了:

test = pd.crosstab(df.id, df.var)  # but it does not work?

如果有人可以帮助我,将不胜感激

编辑,我将所需的结果作为图片附在此处

【问题讨论】:

  • 正如@ayhan 在his comment 中提到的那样 - pd.crosstab(df['id'], df['var']) 应该可以解决问题...

标签: python pandas dataframe pivot-table


【解决方案1】:

您必须提供正确的参数,例如:

pd.crosstab(index=df['id'], columns=df['var'])

var  1  2  3  5  9
id                
a    1  1  1  0  0
b    0  0  0  1  1

【讨论】:

  • 是的,点符号会产生问题,因为.var 是在数据帧上定义的方法。
【解决方案2】:

更新:

In [32]: df.groupby('id')['var'].apply(lambda x: x.astype(str).str.cat(sep=',')).reset_index()
Out[32]:
  id    var
0  a  1,2,3
1  b    5,9

或将var 作为列表:

In [29]: df.groupby('id')['var'].apply(list).reset_index()
Out[29]:
  id        var
0  a  [1, 2, 3]
1  b     [5, 9]

旧答案:

IIUC 你可以使用pivot_table() 内部使用的crosstab() 方法吗?

In [26]: df.pivot_table(index='id', columns='var', aggfunc='size', fill_value=0)
Out[26]:
var  1  2  3  5  9
id
a    1  1  1  0  0
b    0  0  0  1  1

【讨论】:

  • 嗨,谢谢大家的帮助,但很抱歉这不是我想要的。我实际上希望最终输出看起来像这样:a 1 2 3 然后 b 将具有值:5 9 等因此,我们将拥有实际值而不是 1 和 0 标志..(1 2 3 代表 a,5 9 代表b)
  • @tezzaaa,你能在你的问题中post你想要的数据集吗?
  • 嗨,我刚做了。抱歉,我在帖子部分中粘贴格式时遇到了困难。我上传了一张照片:-)
  • 太棒了,非常感谢。我真的很感激
  • @tezzaaa,请考虑accepting 是最有帮助的答案 - 这也表明您的问题已得到解答
猜你喜欢
  • 2014-12-06
  • 2018-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多