使用 pandas 重塑长列 csv 文件以获得合适的数据框 table

Reshape a long column csv file using pandas to get a proper dataframe table

我在 csv 文件中的单列中有数据,我想将其转换为 table 列 headers。输入文件的类型为:

df1 = pd.DataFrame(['CompA','0','0','10.3x','50.0%'
        ,'CompB','0','','13.2x','40.0%',
        'CompC','0','0','2.8x','13.5%',
        'CompD','0','0','3.8x','53.2%'
        ])

我想用 headers

将其转换为 table 数据框
column_names = ['Company name','Revenues','Gross Profit','P/E Multiple','Operating Margin']

因此,各个公司(在上面的示例中是 4 家公司 CompA、CompB、CompC 和 CompD, 每个都有自己的数据行

我尝试了下面的方法,但是很不优雅,更不用说,它涉及到数据的手动计数,这仍然只是添加了 'header column' 数据,但仍然没有生成 table:

arr1 = column_names*4
df1[1] = arr1

然后当我尝试调整它时,它并没有将收入和毛利润等放在一行中,而是为每一个单独创建一行。这就是我所做的:

df2 = df1.pivot(columns=1,values=0)

我该如何解决这个问题?

您可以使用 column_names

reshape 数据框中的值
pd.DataFrame(df1.to_numpy().reshape(-1, len(column_names)), columns=column_names)

输出:

  Company name Revenues Gross Profit P/E Multiple Operating Margin
0        CompA     0         0        10.3x            50.0%
1        CompB     0                  13.2x            40.0%
2        CompC     0         0         2.8x            13.5%
3        CompD     0         0         3.8x            53.2%

你几乎是正确的。 Pivot 可以这样工作,但是,它需要三样东西,要旋转的值,要旋转的列和索引。

我认为这里不需要手动计数。

# Get number of entities in long list
n_entities = int(len(df)/len(column_names))

# Generates n-repetitions of column_names and assign to df for pivot
df['col_name'] = column_names * n_entities 

# Generate and assign an index column
index_vals = []
for i in range(n_entities):
    index_vals.extend([str(i)]*len(column_names))
df['index_val'] = index_vals 

df.pivot(index = 'index_val', columns='col_name', values=0)