Pandas将数据帧值转换为标签

时间:2018-01-14 10:32:52

标签: python pandas dataframe

我正在尝试将当前数据框中的值转换为“索引”,将数据框的索引转换为“标签”。例如:

    Value1    Value2
0     0         1
1     2         4
2     NaN       3

这会导致

    Labels    
0     0         
1     0         
2     1    
3     2
4     1

目前,我设法使用循环来检查并应用必要的标签/值,但是有数百万个标签来标记此过程变得非常耗时。有没有办法以更智能,更快捷的方式做到这一点?提前谢谢。

2 个答案:

答案 0 :(得分:1)

stacktest.js构造函数一起使用:

DataFrame

详情:

s = df.stack() 
df = pd.DataFrame(s.index.get_level_values(0).values,
                  columns=['Labels'],
                  index=s.values.astype(int)).sort_index()
print (df)
   Labels
0       0
1       0
2       1
3       2
4       1

答案 1 :(得分:1)

得到了一个非常好的(感谢熊猫社区的集体努力)。这个应该很快。

它使用repeatravel的灵活性来平衡您的数据。

s = pd.Series(df.index.repeat(2), index=df.values.ravel())
s[s.index.notnull()].sort_index()

0.0    0
1.0    0
2.0    1
3.0    2
4.0    1
dtype: int64

后续转换会产生整数索引:

df.index = df.index.astype(int)

在转换为Series之前执行过滤的类似(稍微快一些,取决于您的数据)解决方案也导致整数索引 -

v = df.index.repeat(df.shape[1])
i = df.values.ravel()

m = ~np.isnan(i)
s = pd.Series(v[m], index=i[m].astype(int)).sort_index()

s

0    0
1    0
2    1
3    2
4    1
dtype: int64

<强>性能

df2 = pd.concat([df] * 10000, ignore_index=True)

# jezrael's solution

%%timeit
s = df2.stack()
pd.DataFrame(s.index.get_level_values(0).values,
             columns=['Labels'],
             index=s.values.astype(int)).sort_index()

4.57 ms ± 220 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

%%timeit
s = pd.Series(df2.index.repeat(2), index=df2.values.ravel())
s[s.index.notnull()].sort_index()

3.12 ms ± 110 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

%%timeit
v = df2.index.repeat(df.shape[1])
i = df2.values.ravel()
m = ~np.isnan(i)
s = pd.Series(v[m], index=i[m].astype(int)).sort_index()

3.1 ms ± 117 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)