Python 更改大熊猫中列的数量
我有一个.txt文件,其中有一行和许多数字,它们之间用可变的空格分隔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个数字是第二行,依此类推 +-------+----
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列的事实弄糊涂了。