我在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_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 $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)