Python 如何将索引中的项作为索引中的列

Python 如何将索引中的项作为索引中的列,python,python-3.x,pandas,Python,Python 3.x,Pandas,我有一个数据框,索引中的信息是每列的标题。这是一个棘手的问题,因为每一行都有其他行可能没有的数据。我试图将这些值替换为“无”。我使用loc方法并通过索引将它们分开,但我担心数据不匹配,因为某些行不像其他行那样拥有所有数据 1. **INDEX** 1. **INFO** 2. address 2. 123 APPLE STREET 3. phone 555-5555 4. name APPLE STORE 5. websit

我有一个数据框,索引中的信息是每列的标题。这是一个棘手的问题,因为每一行都有其他行可能没有的数据。我试图将这些值替换为“无”。我使用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:值的长度与索引的长度不匹配

它清楚地告诉我,一个专栏和另一个专栏的长度不一样,这是因为网站。名称的长度为20,网站的长度为19。我正试图找到一种方法,使丢失的数据成为无,因此长度将再次增加

更新:我认为这将有助于展示我为使数据框架工作而投入的一些工作。这是一个谷歌api,我正试图调整为熊猫数据帧。原始数据是json,当提取它时,很容易,因为我使用了一些if语句,而且我很好用。但是,我使用的是一个for循环,它给了我一个字典列表,而我无法使用dictionary.get方法来提取列。因此,我附加字典的键和值,并将其放在单独的列表中

df1=[]
df2=[]
address= "19.43217, -100.542581"
geocode_url = "https://maps.googleapis.com/maps/api/place/nearbysearch/json?location={}&radius=5000&types=bakery".format(address)
if api_key is not None:
    geocode_url = geocode_url + "&key={}".format(api_key)

    # Ping google for the reuslts:
    results = requests.get(geocode_url)
    # Results will be in JSON format - convert to dict using requests functionality
    places_result = results.json()
#     Ping google for the results:
    for place in places_result['results']:
        my_place_id= place['place_id']
        my_fields= ['name', 'formatted_phone_number','website', 'type','formatted_address']
        place_details= gmaps.place(place_id= my_place_id, fields= my_fields)

#         df1.append(place_details['result'])
#         print(place_details['result'].values())
        for key, value in place_details['result'].items():

            df1.append(key)
            df2.append(value)
data=pd.DataFrame(df2,df1)
data.columns=['info']
data

您可以创建一个分组变量,然后使用
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看起来如何:

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

这是一个数据透视表。我使用
unstack
。在你的评论中,我猜你的
索引
不是一列。它是数据帧的索引,因此我相应地更改了代码

s = df.groupby('INDEX').cumcount()
df_out = df.set_index(s, append=True).INFO.unstack(0, 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


注意:因为您想要
None
,所以我用字符串
None
填充
NaN
。如果您想要python
None
,您应该将其保留为
NaN
,因为它们的工作方式相同。如果您想要
NaN
,请取出选项
fill\u value='None'

,这样就可以了


    import pandas as pd

    INDEX = ['address', 'phone', 'name', 'website', 'type', 'address', 'phone', 'name', 'website', 'type', 'address', 'phone', 'name', 'type']
    INFO = ['123 APPLE STREET', '555-5555', 'APPLE STORE', 'APPLE.COM', 'BUSINESS', '456 peach ave', '777-7777', 'PEACH STORE', 'PEACH.COM', 'BUSINESS', '789 banana rd', '999-9999', 'banana store', 'BUSINESS']
    df = pd.DataFrame(index=INDEX, data=INFO, columns=['INFO'])
    df.index.name = 'INDEX'
    df2 = df.groupby('INDEX').agg(INFO=('INFO', list))
    pd.DataFrame(df2['INFO'].to_list(), index=df2.index).transpose()

这是您得到的输出


    Out[132]: 
    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


我解决了这个问题。大多数答案都可以完成这项任务。然而,数据帧中有一个bug。不管我做了什么,它仍然会给我一个列表错误,所以我在Python中做了一些非正统的事情。我将PDF保存为excel工作表,并将其带回数据框。一旦我这么做了,追踪就消失了。奇怪吧?更大的问题是如何防止这种情况发生。但感谢您的回复。

编辑您的帖子,不要在评论中添加信息似乎是一个简单的pivot或crosstabHey数据新手。那是我的第一次尝试,我使用了一个支点,结束了这一天。但我有一个错误,说这是一份不好的名单。这很奇怪。所以我把它转换成元组,我仍然遇到同样的问题。可能是newdf.T,然后从那里开始呢?newdf.T是一个很好的想法,但请记住它只将行转换成列。所以我得到了一大排。顺便说一句,这是我做的第二件事,除了轴。:)嗨,奥纳姆布,谢谢你的回复。不幸的是,我仍然得到那个打字错误。TypeError:unhashable type:'list'@solomenrichberg你这是什么意思?错误在哪里?当我使用枢轴时。出于某种原因,它将数据帧视为一个列表,透视表认为该列表不可破坏。所以,每当我使用pivotHi-Andy时,我都在编写这个脚本,到目前为止,我觉得我离这个脚本越来越近了。cumcount将为索引中的每个项目提供计数。这是有道理的。然而,我得到了一个关键错误:“索引”。不知道为什么?你的意思是
df.groupby('INDEX').cumcount()
有效,但
df.set_INDEX([s,'INDEX'])
给出了
KeyError:'INDEX'
?正确,这就是我的意思Andy@SolomonRichberg:
INDEX
是数据帧的索引还是列?您可以运行
df.columns
来查看字符串
INDEX
是否在输出中吗?这是它返回的结果。索引(['info'],dtype='object')