在不使用for循环的情况下重新格式化数据帧

时间:2018-02-03 19:59:15

标签: python python-3.x pandas

我想转换数据框,如:

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?)方式吗?

2 个答案:

答案 0 :(得分:4)

嗯,不确定这是否正是您所需要的,或者它是否必须比这更灵活。但是,这将是一种方法 - 假设缺失值可以由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

答案 1 :(得分:1)

这可以分为两部分。

解决方案

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