Python 基于上述逻辑将数据帧从宽缩短为长的有效方法
我有一个列名为“a”、“b”、“c”的数据帧Python 基于上述逻辑将数据帧从宽缩短为长的有效方法,python,python-3.x,pandas,Python,Python 3.x,Pandas,我有一个列名为“a”、“b”、“c”的数据帧 #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.DataFram
#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)
我想将宽数据框缩减为一列,并使用列名
作为数据帧值乘以相应的行值。操作必须按行进行
#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”,因此输出数据帧的前7个元素是bbccc
第1行同样有1'a'1'b'和2'c',因此输出将有abcc作为下4个元素
第2行的值为0,因此将完全跳过
输出的顺序非常重要
例如,第一行有'4'b和3'c',因此输出数据帧必须是bbccc,因为列'b'在列'c'之前。操作必须从左到右按行进行
我正试图找到一种有效的方法来实现这一点。真正的数据集太大,我无法计算。请提供python3解决方案。数据(您也可以),并删除计数为零的行。最后使用构建一个新的数组,并从中构建新的数据帧
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
删除数据(也可以),并删除计数为零的行。最后使用构建一个新的数组,并从中构建新的数据帧
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
我认为pandas在这个过程中不会给你买任何东西,尤其是如果你有大量的数据,你不想把它们全部读入内存,然后再处理成另一个大数据结构
import csv
with open('input.csv', 'r') as fh:
reader = csv.DictReader(fh)
for row in reader:
for key in reader.headers:
value = int(row[key])
for i in range(value):
print(key)
我认为pandas在这个过程中不会给你买任何东西,尤其是如果你有大量的数据,你不想把它们全部读入内存,然后再处理成另一个大数据结构
import csv
with open('input.csv', 'r') as fh:
reader = csv.DictReader(fh)
for row in reader:
for key in reader.headers:
value = int(row[key])
for i in range(value):
print(key)
这就是你真正想要的吗?[{'a':0,'b':4,'c':3}]和[{'a':0,'b':4,'c':2},{'a':0,'b':0,'c':1}]产生相同的输出这一事实没有引起问题吗?输出的顺序有什么关系。例如,第一行为4'b'和3'c',那么输出数据帧的前7行必须为bbccc。输出不能是bcb或任何其他组合。但从我对您描述的理解来看,我的两个示例的输出完全相同:bbccc。只是看看这是不是你想要的哦,我明白你的问题了。不,这不会引起问题。很抱歉,我之前没有理解你的问题。这两个应该给出相同的输出。我必须考虑一下,看看是否有任何方法可以使用pandas重塑代码()来实现您想要的功能,但是我想知道你的数据是从哪里来的,通过输入数据进行流式处理是否比将所有内容加载到内存中更容易,而不是以你最初想要的方式加载。这是你真正想要的吗?[{'a':0,'b':4,'c':3}]和[{'a':0,'b':4,'c':2},{'a':0,'b':0,'c':1}]产生相同的输出这一事实没有引起问题吗?输出的顺序有什么关系。例如,第一行为4'b'和3'c',那么输出数据帧的前7行必须为bbccc。输出不能是bcb或任何其他组合。但从我对您描述的理解来看,我的两个示例的输出完全相同:bbccc。只是看看这是不是你想要的哦,我明白你的问题了。不,这不会引起问题。很抱歉,我之前没有理解你的问题。这两个应该给出相同的输出。我必须考虑一下,看看是否有任何方法可以使用pandas重塑代码()来实现您想要的功能,但是我想知道你的数据是从哪里来的,通过输入数据进行流式处理是否比将所有内容加载到内存中更容易,而不是按照你最初想要的方式。非常感谢!这就完成了任务!非常感谢你!这就完成了任务!