将嵌套的Dataframe转换为简单的Dataframeframe

2024-09-30 10:36:58 发布

您现在位置:Python中文网/ 问答频道 /正文

确实需要帮助,因为教程似乎没有解决这个问题。我花了一整天的时间在这件事上,找不到解决办法

我下载了API数据,并将其从json转换为python字典格式。然而,字典非常复杂,它有一个字典的字典

下面是这条格言的开头:

df[1]
Out[47]: 
flight_date                                             2020-07-07
flight_status                                            scheduled
departure        {'airport': 'Findel', 'timezone': 'Europe/Luxe...
arrival          {'airport': 'Francisco Sá Carneiro', 'timezone...
airline          {'name': 'TAP Air Portugal', 'iata': 'TP', 'ic...
flight           {'number': '6794', 'iata': 'TP6794', 'icao': '...
aircraft                                                      None
live                                                          None
Name: 1, dtype: object

Picture of the dict

在出发和到达的行中有不同机场的国际航空运输协会代码(例如:“国际航空运输协会”:“卢森堡”)。见下面的例子

离别用语:

{'airport': 'Findel', 'timezone': 'Europe/Luxembourg', 'iata': 'LUX', 'icao': 'ELLX', 'terminal': None, 'gate': None, 'delay': None, 'scheduled': '2020-07-07T06:30:00+00:00', 'estimated': '2020-07-07T06:30:00+00:00', 'actual': None, 'estimated_runway': None, 'actual_runway': None}

我试图将这些复杂的字典简化为一个简单的表,由给定日期的出发iata代码列和相应的到达iata代码列组成

如果您对如何解决这个问题有任何想法,或者知道好的文档,请将其发送给他人

非常感谢


Tags: 代码none字典flight协会国际timezoneeurope
1条回答
网友
1楼 · 发布于 2024-09-30 10:36:58

对于字典中的单个值,可以使用

df['departure_iata'] = df['departure'].apply(lambda item: item['iata'])

对于少数值,您可以使用类似于Series

df[['departure_airport', 'departure_iata']] = df['departure'].apply(lambda item: pd.Series([item['airport'], item['iata']]))

对于所有值,可以使用... = df['departure'].apply(pd.Series),但需要手动写入所有列的名称

df[['departure_airport', 'departure_timezone', 'departure_iata', 'departure_icao', 'departure_terminal', 'departure_gate', 'departure_delay', 'departure_scheduled', 'departure_estimated', 'departure_actual', 'departure_estimated_runway', 'departure_actual_runway'] ] = df['departure'].apply(pd.Series)

使用assign可以使它更简单,但它不会将前缀departure_添加到新列中-如果您想对具有相同名称的arrival执行相同操作,则可能会出现问题

df = df.assign(**df['departure'].apply(pd.Series))

但是您可以在Series中设置前缀

df = df.assign(
    **df['departure'].apply(
        lambda item: pd.Series({'departure_'+key:val for key,val in item.items()})
    )
)

编辑:用^{稍微简单一点

df = df.assign(**df['departure'].apply(lambda item:pd.Series(item).add_prefix('departure_')))

df = df.assign(**df['departure'].apply(pd.Series).add_prefix('departure_'))

最小工作代码

import pandas as pd

data = {
    'A': [1,2,3],
    'B': [4,5,6],
    'departure': [
        {'airport': 'Findel', 'timezone': 'Europe/Luxembourg', 'iata': 'LUX', 'icao': 'ELLX', 'terminal': None, 'gate': None, 'delay': None, 'scheduled': '2020-07-07T06:30:00+00:00', 'estimated': '2020-07-07T06:30:00+00:00', 'actual': None, 'estimated_runway': None, 'actual_runway': None},
        {'airport': 'Findel', 'timezone': 'Europe/Luxembourg', 'iata': 'LUX', 'icao': 'ELLX', 'terminal': None, 'gate': None, 'delay': None, 'scheduled': '2020-07-07T06:30:00+00:00', 'estimated': '2020-07-07T06:30:00+00:00', 'actual': None, 'estimated_runway': None, 'actual_runway': None},
        {'airport': 'Findel', 'timezone': 'Europe/Luxembourg', 'iata': 'LUX', 'icao': 'ELLX', 'terminal': None, 'gate': None, 'delay': None, 'scheduled': '2020-07-07T06:30:00+00:00', 'estimated': '2020-07-07T06:30:00+00:00', 'actual': None, 'estimated_runway': None, 'actual_runway': None},
    ]
} # columns

df = pd.DataFrame(data)
print(df)

df['departure_iata'] = df['departure'].apply(lambda item: item['iata'])
#df['departure_iata'] = df['departure'].str['iata']
print(df['departure_iata'])

df[['departure_airport', 'departure_iata']] = df['departure'].apply(lambda item: pd.Series([item['airport'], item['iata']]))
print(df[['departure_airport', 'departure_iata']])

df[['departure_airport', 'departure_timezone', 'departure_iata', 'departure_icao', 'departure_terminal', 'departure_gate', 'departure_delay', 'departure_scheduled', 'departure_estimated', 'departure_actual', 'departure_estimated_runway', 'departure_actual_runway'] ] = df['departure'].apply(pd.Series)
print(df[['departure_airport', 'departure_iata', 'departure_timezone']])

#  

df = df.assign(**df['departure'].apply(pd.Series))
print(df)

df = df.assign(
    **df['departure'].apply(
        lambda item: pd.Series({'departure_'+key:val for key,val in item.items()})
    )
)
print(df)

df = df.assign(**df['departure'].apply(lambda item:pd.Series(item).add_prefix('departure_')))
print(df)

df = df.assign(**df['departure'].apply(pd.Series).add_prefix('departure_'))
print(df)

顺便说一句:您也可以使用concat()来代替assign()

df = pd.concat([df, df['departure'].apply(pd.Series).add_prefix('departure_')], axis=1)
print(df.columns)

您甚至可以删除列'departure'

df = pd.concat([df.drop(['departure'], axis=1), df['departure'].apply(pd.Series).add_prefix('departure_')], axis=1)
print(df.columns)

编辑:

将行转换为列

df = df.T

在这个示例中,我必须使用apply(eval),因为我将字典作为字符串,并且必须转换为Python字典

text = '''flight_date                                             2020-07-07
flight_status                                            scheduled
departure        {'airport': 'Findel', 'timezone': 'Europe/Luxe...'}
arrival          {'airport': 'Francisco Sá Carneiro', 'timezone':'...'}
airline          {'name': 'TAP Air Portugal', 'iata': 'TP', 'icao':'...'}
flight           {'number': '6794', 'iata': 'TP6794', 'icao': '...'}
aircraft                                                      None
live                                                          None'''

import pandas as pd
import io

df = pd.read_csv(io.StringIO(text), sep='\s{2,}', header=None)

df.rename(columns={0:'index'}, inplace=True)
df.index = df['index']
df = df.drop('index', axis=1)
print(df)
print(' -')

df = df.T
print(df)
print(' -')

df['departure'] = df['departure'].apply(eval)

df['departure_airport'] = df['departure'].apply(lambda item: item['airport'])

print(df['departure_airport'])

相关问题 更多 >

    热门问题