数据透视/变换/矢量化操作

2024-03-02 19:33:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我不是Pandas方面的专家,但我想知道是否有一种pythonic方法可以将Pandas DF中的一系列数据转换为包含“1”和“0”数组的列标题。你知道吗

我有以下数据帧:

df1 = pd.DataFrame({'x':[254,300,300,300,850,850,1000],
                    'y':[57,12,34,45,8,45,9]})

x和y是相同大小的向量,我希望“x”是索引,“y”中的值是列标题,“0”和“1”表示x行中是否存在y值,因此我的转换DF大致如下所示:

enter image description here


Tags: 数据方法标题dataframepandasdf数组pythonic
3条回答

一个不太像Python的、非常直观的解决方案是:

x_set = sorted(set(df1.x.tolist()))
y_set = sorted(set(df1.y.tolist()))

dF = pd.DataFrame({}, index=x_set, columns=y_set).fillna(0).sort_index()
dF.index.name = 'x'
dF.columns.name = 'y'
for idx, row in df1.iterrows():
    a = row['x']
    b = row['y']
    dF.loc[a, b] += 1

从而产生:

enter image description here

有很多选项,其中一个是使用专门为此(docs)设计的crosstab函数:

In [2]: pd.crosstab(df1['x'], df1['y'])
Out[2]:
y     8   9   12  34  45  57
x
254    0   0   0   0   0   1
300    0   0   1   1   1   0
850    1   0   0   0   1   0
1000   0   1   0   0   0   0

使用unstack可能更快:

In [245]:

df1['z'] = 1
df1.groupby(['x', 'y']).count().unstack().fillna(0)
       z                    
y     8   9   12  34  45  57
x                           
254    0   0   0   0   0   1
300    0   0   1   1   1   0
850    1   0   0   0   1   0
1000   0   1   0   0   0   0

In [256]:

%timeit pd.crosstab(df1['x'], df1['y'])
100 loops, best of 3: 8.72 ms per loop
In [261]:

%%timeit
df1['z'] = 1
df1.groupby(['x', 'y']).count().unstack().fillna(0)
100 loops, best of 3: 4.75 ms per loop
In [262]:

%%timeit
df1['z'] = 1
df1.groupby(['x', 'y']).sum().unstack().fillna(0)
100 loops, best of 3: 4.88 ms per loop

相关问题 更多 >