我有一个带有Col名称为'a','b','c'的DataFrame
#Input
import pandas as pd
list_of_dicts = [
{'a' : 0, 'b' : 4, 'c' : 3},
{'a' : 1, 'b' : 1, 'c' : 2 },
{'a' : 0, 'b' : 0, 'c' : 0 },
{'a' : 1, 'b' : 0, 'c' : 3 },
{'a' : 2, 'b' : 1, 'c' : 0 }
]
df = pd.DataFrame(list_of_dicts)
#Input DataFrame
-----|------|------|-----|
| a | b | c |
-----|------|------|-----|
0 | 0 | 4 | 3 |
1 | 1 | 1 | 2 |
2 | 0 | 0 | 0 |
3 | 1 | 0 | 3 |
4 | 2 | 1 | 0 |
我想将宽的DataFrame减少为One列,将列名作为DataFrame值乘以相应的行值。该操作必须按行进行。
#Output
| Values |
-----------------
0 | b |
1 | b |
2 | b |
3 | b |
4 | c |
5 | c |
6 | c |
7 | a |
8 | b |
9 | c |
10 | c |
11 | a |
12 | c |
13 | c |
14 | c |
15 | a |
17 | a |
18 | b |
说明:输入数据帧中的行0具有4'b'和3'c',因此输出数据帧的前七个元素为bbbbccc
第1行类似地具有1'a'1'b'和2'c',因此输出将以abcc作为接下来的4个元素
第2行的跨度为0,因此将完全跳过。
输出的顺序非常重要例如,第一行具有'4'b和3'c',因此输出DataFrame必须为bbbbccc,因为列'b'在列'c'之前。该操作必须是从左到右逐行的。
我正在尝试找到一种有效的方法来实现这一目标。在真正的数据集太大,我计算。请提供python3解决方案。
堆叠数据(您也可以融化数据),并删除计数为零的行。最后,使用numpy.repeat构建一个新数组,并从中构建新的数据框。
reshape = df.stack().droplevel(0).loc[lambda x: x != 0]
pd.DataFrame(np.repeat(reshape.index, reshape), columns=['values'])
values
0 b
1 b
2 b
3 b
4 c
5 c
6 c
7 a
8 b
9 c
10 c
11 a
12 c
13 c
14 c
15 a
16 a
17 b
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句