使用单独文件中的整数将熊猫数据框中的列分组

时间:2019-04-18 20:50:00

标签: python pandas

我想在一个文件中使用整数来相应命名另一个文件中的列。例如:

文件1

3 2 3 3 3 2

文件2

0.2 0.0 0.0 1.0 0.98 0.98 0.02 0.02 0.97 
0.4 0.4 0.3 2.0 0.30 0.03 0.30 0.93 0.39

File1中的第一个整数是3,因此在File2中,我想将前三列(在列0之后)指定为0_1, 0_2, 0_3。 File1中的第二个整数是2,因此File2中的后两列将指定为1_1, 1_2

预期输出为:

  time  0_1  0_2  0_3   1_1   1_2   2_1   2_2   2_3   
   0.2  0.0  0.0  1.0  0.98  0.98  0.02  0.02  0.97 
   0.4  0.4  0.3  2.0  0.30  0.03  0.30  0.93  0.39

当我按照以下方式分配索引时,我最终得到的列编号是相同的-有没有办法我可以实现所需的输出?

import pandas as pd
import numpy as np
import sys

file1 = "nsubs"
new = ['time']

file2 = sys.argv[1]

df = pd.read_csv(file1, sep=" ", header=None)
num = df.iloc[0].values.tolist()
for idx, item in enumerate(num):
    if item == 3:
        new.append(idx)
        new.append(idx[2])
        new.append(idx)
    else:
        new.append(idx)
        new.append(idx)

df2 = pd.read_csv(file2, sep=" ", header=None)
df2.columns = [new]

实际输出:

  time    0    0    0     1     1     2     2     2 
   0.2  0.0  0.0  1.0  0.98  0.98  0.02  0.02  0.97 
   0.4  0.4  0.3  2.0  0.30  0.03  0.30  0.93  0.39

1 个答案:

答案 0 :(得分:0)

有了数据,您实际上并不需要熊猫作为列标题。您可以将它们读入列表并对其进行列表理解以获得标题。

读入文本文件,使用split函数将其分离出来,然后将其转换为整数

with open('file1.txt', 'r') as f:
    column_counts = [int(i) for i in f.read().split()]
# [3, 2, 3, 3, 3, 2]

然后,您只需要创建一个简单的循环。使用enumerate()来对集合进行计数,并使用该值将接下来的几列作为子集。显示了for循环用于演示,但我建议使用列表理解。

colums = ['time']
for i, n in enumerate(column_counts):
    for j in range(1, n+1):
        columns.append("{}_{}".format(i, j))

columns = ['time'] + ["{}_{}".format(i, j) for i, n in enumerate(column_counts) for j in range(1, n+1)]
#['time', '0_1', '0_2', '0_3', '1_1', '1_2', '2_1', '2_2', '2_3', '3_1', '3_2', '3_3', '4_1', '4_2', '4_3', '5_1', '5_2']

在您的示例中,file1产生的列列表比file2长得多,因此,一旦知道数据帧需要多少列,就必须将它们切出。如果您的数据与它们匹配,则在创建数据框时可以使用columns=columns

df = pd.read_csv('file2.txt', sep=" ", header=None)
df.columns = columns[:len(df.columns)]
df.set_index('time', inplace=True)

print(df)
#       0_1  0_2  0_3   1_1   1_2   2_1   2_2   2_3
# time                                             
# 0.2   0.0  0.0  1.0  0.98  0.98  0.02  0.02  0.97
# 0.4   0.4  0.3  2.0  0.30  0.03  0.30  0.93  0.39