python - 包含重复索引的两个以上 DataFrame 的笛卡尔积

标签 python pandas

假设我有以下 DataFrame,其中每一行代表特定用户在特定时间执行的事件:

In [1]: df
Out[1]: 
      time event
user            
a        1     x
a        2     y
a        3     z
b        1     x
b        2     x
b        3     z
b        4     z
c        1     y
c        2     y
c        3     z
d        1     z

我想 reshape 它,使其具有以下结构:

In [2]: dfm
Out[2]: 
       x   y  z
user           
a      1   2  3
b      1 NaN  3
b      1 NaN  4
b      2 NaN  3
b      2 NaN  4
c    NaN   1  3
c    NaN   2  3
d    NaN NaN  1

我目前通过首先为每个事件创建一个 DataFrame 来获得它:

In [3]: dfs = [d[['time']].rename(columns={'time': k}) for k, d in df.groupby('event')]

In [4]: dfs
Out[4]: 
[      x
 user   
 a     1
 b     1
 b     2,       y
 user   
 a     2
 c     1
 c     2,       z
 user   
 a     3
 b     3
 b     4
 c     3
 d     1]

然后多次调用pd.merge:

In [5]: dfm = dfs[0]

In [5]: for d in dfs[1:]:
   ...:     dfm = pd.merge(dfm, d, left_index=True, right_index=True, how='outer')

这很好用,但我想知道是否有更好的方法。 pandas 的一些漂亮功能让我大吃一惊,这已经不是第一次了!我试过 pd.concat(dfs, axis=1),但会产生以下错误(仅显示最后一行):

ValueError: Shape of passed values is (1, 5), indices imply (1, 4)

我也研究过 pd.pivot_table,但它会为每个用户生成一行并对时间戳进行平均。也许我忽略了一些东西。非常感谢任何帮助!

最佳答案

下面是问题中讨论的解决方案

import pandas as pd
from StringIO import StringIO

data = \
'user,time,event\n\
a,1,x\n\
a,2,y\n\
a,3,z\n\
b,1,x\n\
b,2,x\n\
b,3,z\n\
b,4,z\n\
c,1,y\n\
c,2,y\n\
c,3,z\n\
d,1,z\n'

df = pd.read_csv(StringIO(data), index_col='user')
dfs = [d[['time']].rename(columns={'time': k}) for k, d in df.groupby('event')]
dfm = dfs[0]
for d in dfs[1:]:
    dfm = pd.merge(dfm, d, left_index=True, right_index=True, how='outer')

关于python - 包含重复索引的两个以上 DataFrame 的笛卡尔积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20423974/

相关文章:

python - 通过固定间隔采样将列表缩小到固定大小

python - 有没有更好的方法来创建嵌套字典的值列表?

python - 是否保证对 Pandas 数据框中的级别列表进行排序?

python - 用 pandas 数据框中的一些默认值填充每个列组合的值

python-3.x - 按列位置分组的 Pandas 数据框

python - 检查 pandas df 中是否存在列是否有意义

python - 使用 Pandas 从另一个数据帧中包含的值检测数据帧的索引

python - 在 Python 中从二维数组打印时如何排列列?

python - 为什么使用 int() 内置从 .txt 文件读取部分行时抛出 ValueError ?

python - Matplotlib 动画太慢(~3 fps)