Python 更改大熊猫中列的数量

Python 更改大熊猫中列的数量,python,pandas,Python,Pandas,我有一个.txt文件,其中有一行和许多数字,它们之间用可变的空格分隔 32 45 2.65 -845 1 -84 97.236 454 35.78 77.12 948.87 151 -23.5 -787.48 13.005 31 我知道每个x数字都是x,每个文件中都有一个固定的数量,应该有一个中断。例如,4列中的前4个数字是第一行,下4个数字是第二行,依此类推 +-------+----

我有一个.txt文件,其中有一行和许多数字,它们之间用可变的空格分隔

32 45 2.65   -845     1 -84    97.236        454   35.78 77.12    948.87       
         151    -23.5         -787.48     13.005   31
我知道每个x数字都是x,每个文件中都有一个固定的数量,应该有一个中断。例如,4列中的前4个数字是第一行,下4个数字是第二行,依此类推

+-------+---------+--------+------+ | col1 | col2 | col3 | col4 | +-------+---------+--------+------+ | 32 | 45 | 2.65 | -845 | | 1 | -84 | 97.236 | 454 | | 35.78 | 77.12 | 948.87 | 151 | | -23.5 | -787.48 | 13.005 | 31 | +-------+---------+--------+------+
这将创建一个csv,其中包含一行和与值一样多的列,但我希望数据包含特定数量的列,在本例中为4列。

从文件中创建所有可能值的列表,然后按numpy重塑。重塑4列数据框:

with open('data.txt') as f:
    L = [x for line in f for x in line.strip().split()]
    print (L)
['32', '45', '2.65', '-845', '1', '-84', '97.236', '454', 
 '35.78', '77.12', '948.87', '151', '-23.5', '-787.48', '13.005', '31']


df = pd.DataFrame(np.array(L).reshape(-1, 4))
print (df)
       0        1       2     3
0     32       45    2.65  -845
1      1      -84  97.236   454
2  35.78    77.12  948.87   151
3  -23.5  -787.48  13.005    31
但解决方案不起作用,如果无法创建完整的4列,则有点复杂:

#missing last value
print (L)
['32', '45', '2.65', '-845', '1', '-84', '97.236', '454', '35.78', 
 '77.12', '948.87', '151', '-23.5', '-787.48', '13.005']

arr = np.empty(((len(L) - 1)//4 + 1)*4, dtype='O')
arr[:len(L)] = L
df = pd.DataFrame(arr.reshape((-1, 4))).fillna('0')
print(df)
       0        1       2     3
0     32       45    2.65  -845
1      1      -84  97.236   454
2  35.78    77.12  948.87   151
3  -23.5  -787.48  13.005     0

从文件中创建所有可能值的列表,然后按numpy重塑。为4列DataFrame重塑:

with open('data.txt') as f:
    L = [x for line in f for x in line.strip().split()]
    print (L)
['32', '45', '2.65', '-845', '1', '-84', '97.236', '454', 
 '35.78', '77.12', '948.87', '151', '-23.5', '-787.48', '13.005', '31']


df = pd.DataFrame(np.array(L).reshape(-1, 4))
print (df)
       0        1       2     3
0     32       45    2.65  -845
1      1      -84  97.236   454
2  35.78    77.12  948.87   151
3  -23.5  -787.48  13.005    31
但解决方案不起作用,如果无法创建完整的4列,则有点复杂:

#missing last value
print (L)
['32', '45', '2.65', '-845', '1', '-84', '97.236', '454', '35.78', 
 '77.12', '948.87', '151', '-23.5', '-787.48', '13.005']

arr = np.empty(((len(L) - 1)//4 + 1)*4, dtype='O')
arr[:len(L)] = L
df = pd.DataFrame(arr.reshape((-1, 4))).fillna('0')
print(df)
       0        1       2     3
0     32       45    2.65  -845
1      1      -84  97.236   454
2  35.78    77.12  948.87   151
3  -23.5  -787.48  13.005     0

我将使用Numpy加载数据

import numpy
import pandas

data = numpy.loadtxt('temp.txt').reshape(-1, 4)
pandas.DataFrame(data)

编辑:交换了-1和4。

我将使用Numpy加载数据

import numpy
import pandas

data = numpy.loadtxt('temp.txt').reshape(-1, 4)
pandas.DataFrame(data)

编辑:交换了-1和4。

最好的方法是将原始文件读取为str,使用regex re.sub'\s+','',string_值将多个空格替换为单个空格,保存它并使用pandas for DF再次读取。基本上,我的意思是更改完整字符串的结构,然后使用pandas。最好的方法是将原始文件读取为str,使用regex re.sub'\s+','',string_value,将多个空格替换为单个空格,保存它并使用pandas for DF再次读取。基本上,我的意思是更改整个字符串的结构,然后使用pandas.reforme4,-1将输出4行,而不是4列。这是一种更简单的方法,但与@JānisŠ一样。建议,它应该是重塑-1,4。这就是为什么我接受了另一个答案+无论如何,谢谢你!对的我被测试数据同时有4行和4列的事实弄糊涂了。重塑4,-1将输出4行,而不是4列。建议,它应该是重塑-1,4。这就是为什么我接受了另一个答案+无论如何,谢谢你!对的我被测试数据同时有4行和4列的事实弄糊涂了。