使用panda重新塑造一个长列csv文件,以获得正确的数据帧表



我在csv文件中的一列中有数据,我想将其转换为带有列标题的表。输入文件的类型为:

df1 = pd.DataFrame(['CompA','$200','$450','10.3x','50.0%'
,'CompB','$300','$50','13.2x','40.0%',
'CompC','$100','$150','2.8x','13.5%',
'CompD','$150','$250','3.8x','53.2%'
])

我想将其转换为具有标题的表数据帧

column_names = ['Company name','Revenues','Gross Profit','P/E Multiple','Operating Margin']

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

我尝试了以下操作,但它非常不雅,更不用说,它涉及到数据的手动计数,这仍然只是添加了"头列"数据,但仍然没有形成表格:

arr1 = column_names*4
df1[1] = arr1

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

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

我该如何解决这个问题?

您可以使用column_namesreshape数据帧中的值

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     $200         $450        10.3x            50.0%
1        CompB     $300          $50        13.2x            40.0%
2        CompC     $100         $150         2.8x            13.5%
3        CompD     $150         $250         3.8x            53.2%

你几乎是对的。透视可以这样工作,但是,它需要三件事,即要透视的值、要透视的列和索引。

我认为没有必要在这里手动计数。

# 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)

最新更新