我正在尝试将当前数据框中的值转换为“索引”,将数据框的索引转换为“标签”。例如:
Value1 Value2
0 0 1
1 2 4
2 NaN 3
这会导致
Labels
0 0
1 0
2 1
3 2
4 1
目前,我设法使用循环来检查并应用必要的标签/值,但是有数百万个标签来标记此过程变得非常耗时。有没有办法以更智能,更快捷的方式做到这一点?提前谢谢。
答案 0 :(得分:1)
将stack
与test.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)
得到了一个非常好的(感谢熊猫社区的集体努力)。这个应该很快。
它使用repeat
和ravel
的灵活性来平衡您的数据。
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)