我想转换数据框,如:
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?)方式吗?
答案 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’)
})