Python 如何将索引中的项作为索引中的列
我有一个数据框,索引中的信息是每列的标题。这是一个棘手的问题,因为每一行都有其他行可能没有的数据。我试图将这些值替换为“无”。我使用loc方法并通过索引将它们分开,但我担心数据不匹配,因为某些行不像其他行那样拥有所有数据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
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
。如果您想要pythonNone
,您应该将其保留为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')