如何将索引中的项目作为大熊猫中的列

问题描述 投票:0回答:3

我有一个熊猫数据框,其中索引中的信息是每一列的标题。这很棘手,因为每一行都有其他行可能没有的数据。我正在尝试将这些值替换为“无”。我使用loc方法并按索引将它们分开,但是我担心数据不匹配,因为某些行不像其他行那样拥有所有数据。

1. **INDEX**       1.  **INFO**
2. address         2. 123 APPLE STREET
3. phone           555-5555
4. name            APPLE STORE
5. website         APPLE.COM
6. type            BUSINESS
7. address         456 peach ave
8. phone           777-7777
9. name            PEACH STORE
10. website         PEACH.COM
11. type            BUSINESS
12. address         789 banana rd
13. phone           999-9999
14. name            banana store
15. type            BUSINESS

我想转换成这个

20.  **ADDRESS**      **PHONE**      **NAME**    **WEBSITE**        **TYPE**
21.  123 APPLE ST   555-5555        APPLE STORE     APPLE.COM        BUSINESS
22.  345 PEACH AVE  777-7777        PEACH STORE     PEACH.COM        BUSINESS
23.  789 banana rd  999-9999        banana store    None             BUSINESS

这是我尝试过的。将熊猫导入为pd

address = data.loc['formatted_address']
name = data.loc['name']
phone_number = data.loc['formatted_phone_number']
website = data.loc['website']
field = data.loc['types']
newdf = pd.DataFrame(address['info'])
newdf['Name'] = name['info'].to_list()
newdf['website'] = website['info'].to_list()  # 
print(newdf)

当我打印newdf时,出现此错误。ValueError:值的长度与索引的长度不匹配

很明显地告诉我,一列的长度与另一列的长度不同,这是由于网站所致。 Name的长度为20,网站的长度为19。我正在尝试找到一种方法来使丢失的数据变为None,因此长度将再次变为[]。

我有一个熊猫数据框,其中索引中的信息是每一列的标题。这很棘手,因为每一行都有其他行可能没有的数据。我正在尝试替换那些...

python python-3.x pandas
3个回答
0
投票

您可以创建一个分组变量,然后使用pivot重塑形状>

df.assign(grp=df.iloc[:,0].str.contains('address').cumsum()).pivot('grp','INDEX','INFO')
Out: 
INDEX              address          name     phone      type    website
grp                                                                    
1      2. 123 APPLE STREET   APPLE STORE  555-5555  BUSINESS  APPLE.COM
2            456 peach ave   PEACH STORE  777-7777  BUSINESS  PEACH.COM
3            789 banana rd  banana store  999-9999  BUSINESS        NaN

您的df外观:


0
投票

这是枢轴工作台。我使用unstack

s = df.groupby('INDEX').cumcount()
df_out = df.set_index([s, 'INDEX']).INFO.unstack(fill_value='None')

Out[111]:
INDEX           address          name     phone      type    website
0      123 APPLE STREET   APPLE STORE  555-5555  BUSINESS  APPLE.COM
1         456 peach ave   PEACH STORE  777-7777  BUSINESS  PEACH.COM
2         789 banana rd  banana store  999-9999  BUSINESS       None

0
投票

我认为这应该可以解决问题,

    data.unstack()
© www.soinside.com 2019 - 2024. All rights reserved.