【问题标题】:Reformatting a dataframe without using for loops在不使用 for 循环的情况下重新格式化数据帧
【发布时间】:2018-02-03 19:59:15
【问题描述】:

我想转换如下数据框:

id  event_type count

1      "a"       3
1      "b"       5
2      "a"       1
3      "b"       2

进入如下数据框:

id    a    b   a > b
1     3    5     0
2     1    0     1
3     0    2     0

不使用 for 循环。这样做的正确pythonic(Pandas-tonic?)方式是什么?

【问题讨论】:

  • 相同ID的数量是否保证为2?或者tehre也可以是一行1 "c" 6
  • @displayname event_type 只能是两个(“a”或“b”),ID 可以是 n。数据框中没有像 ´´´1 "c" 6´´´ 这样的行。

标签: python python-3.x pandas


【解决方案1】:

嗯,不确定这是否正是您所需要的,或者它是否必须比这更灵活。但是,这将是一种方法 - 假设缺失值可以替换为 0

import pandas as pd
from io import StringIO

# Creating and reading the data

data = """
id  event_type count
1      "a"       3
1      "b"       5
2      "a"       1
3      "b"       2
"""
df = pd.read_csv(StringIO(data), sep='\s+')

# Transforming

df_ = pd.pivot_table(df, index='id', values='count', columns='event_type') \
        .fillna(0).astype(int)
df_['a > b'] = (df_['a'] > df_['b']).astype(int)

df_ 将采用以下形式:

event_type  a  b  a > b
id                     
1           3  5      0
2           1  0      1
3           0  2      0

【讨论】:

  • 不错的答案 (-:
【解决方案2】:

这可以分为两部分。

解决方案

df.set_index(
    [‘id’, ‘event_type’]
)[‘count’].unstack(
    fill_value=0
).assign(**{
    ‘a < b’: lambda d: d.eval(‘a < b’)
})

【讨论】:

  • 哇,我喜欢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-04
相关资源
最近更新 更多