Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 基于上述逻辑将数据帧从宽缩短为长的有效方法_Python_Python 3.x_Pandas - Fatal编程技术网

Python 基于上述逻辑将数据帧从宽缩短为长的有效方法

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

我有一个列名为“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.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重塑代码()来实现您想要的功能,但是我想知道你的数据是从哪里来的,通过输入数据进行流式处理是否比将所有内容加载到内存中更容易,而不是按照你最初想要的方式。非常感谢!这就完成了任务!非常感谢你!这就完成了任务!