【问题标题】:PANDAS Create Dataframe from list of items that need parsing and matchingPANDAS 从需要解析和匹配的项目列表中创建数据框
【发布时间】:2021-02-25 21:05:01
【问题描述】:

我有一个项目列表和国家状态。

res = [('63(I)[PARA.8]','AFGHANISTAN Y ARGENTINA Y AUSTRALIA Y BELGIUM Y BOLIVIA Y BRAZIL N BYELORUSSIAN SSR Y CANADA Y CHILE Y CHINA A COLOMBIA Y COSTA RICA Y CUBA A CZECHOSLOVAKIA Y DENMARK Y DOMINICAN REPUBLIC A ECUADOR Y EGYPT Y EL SALVADOR Y ETHIOPIA Y FRANCE Y GREECE Y GUATEMALA  HAITI Y HONDURAS Y ICELAND A INDIA Y IRAN Y IRAQ Y LEBANON N LIBERIA Y LUXEMBOURG Y MEXICO Y NETHERLANDS Y NEW ZEALAND Y NICARAGUA Y NORWAY Y PANAMA Y PARAGUAY Y PERU Y PHILIPPINE REPUBLIC N POLAND Y SAUDI ARABIA Y SWEDEN Y SYRIA Y TURKEY N UKRAINIAN SSR Y UNION OF SOUTH AFRICA N USSR Y UNITED KINGDOM Y UNITED STATES Y URUGUAY A VENEZUELA N YUGOSLAVIA'),
 ('63(I)[PARA.7]',
  'AFGHANISTAN Y ARGENTINA Y AUSTRALIA Y BELGIUM Y BOLIVIA Y BRAZIL N BYELORUSSIAN SSR Y CANADA Y CHILE Y CHINA A COLOMBIA Y COSTA RICA Y CUBA A CZECHOSLOVAKIA Y DENMARK Y DOMINICAN REPUBLIC A ECUADOR Y EGYPT Y EL SALVADOR Y ETHIOPIA Y FRANCE Y GREECE Y GUATEMALA  HAITI Y HONDURAS Y ICELAND A INDIA Y IRAN Y IRAQ Y LEBANON N LIBERIA Y LUXEMBOURG Y MEXICO Y NETHERLANDS Y NEW ZEALAND Y NICARAGUA Y NORWAY Y PANAMA Y PARAGUAY Y PERU Y PHILIPPINE REPUBLIC N POLAND Y SAUDI ARABIA Y SWEDEN Y SYRIA Y TURKEY N UKRAINIAN SSR Y UNION OF SOUTH AFRICA N USSR Y UNITED KINGDOM Y UNITED STATES Y URUGUAY A VENEZUELA N YUGOSLAVIA'),
 ('63(I)[PARA.6]',
  'AFGHANISTAN Y ARGENTINA Y AUSTRALIA Y BELGIUM Y BOLIVIA Y BRAZIL N BYELORUSSIAN SSR Y CANADA Y CHILE Y CHINA A COLOMBIA Y COSTA RICA Y CUBA A CZECHOSLOVAKIA Y DENMARK Y DOMINICAN REPUBLIC A ECUADOR Y EGYPT Y EL SALVADOR Y ETHIOPIA Y FRANCE Y GREECE Y GUATEMALA  HAITI Y HONDURAS Y ICELAND A INDIA Y IRAN Y IRAQ Y LEBANON N LIBERIA Y LUXEMBOURG Y MEXICO Y NETHERLANDS Y NEW ZEALAND Y NICARAGUA Y NORWAY Y PANAMA Y PARAGUAY Y PERU Y PHILIPPINE REPUBLIC N POLAND Y SAUDI ARABIA Y SWEDEN Y SYRIA Y TURKEY N UKRAINIAN SSR Y UNION OF SOUTH AFRICA N USSR Y UNITED KINGDOM Y UNITED STATES Y URUGUAY A VENEZUELA N YUGOSLAVIA'),
 ('99(I)', 'No Data'),
 ('50(I)', 'No Data')]

如何使用这些列创建数据框

columns = ['Country','63(I)[PARA.8]','63(I)[PARA.7]','63(I)[PARA.6]','99(I)','50(I)']
dfte = pd.DataFrame(columns=columns)
dfte

在 Country 列中映射国家时,“Y”、“N”、“A”或 nan 将填充到单元格中。 “无数据”表示第 99(I) 列和第 50(I) 列将为空白。

Country      63(I)[PARA.8]  63(I)[PARA.7]   63(I)[PARA.6]   99(I)   50(I)
AFGHANISTAN      Y               Y               Y
ARGENTINA        Y               Y               Y
AUSTRALIA        Y               Y               Y
...

【问题讨论】:

  • 您应该将您的res 重新组织为一个字典,然后将其作为数据传递。 df = pd.DataFrame(data=res_new, columns=columns)
  • @noah 是的,我无法将其放入 dict 并解析国家/地区状态......
  • 危地马拉的规则是什么?数据有“... GREECE Y GUATEMALA HAITI Y...”(危地马拉没有单字母代码;每个其他国家/地区都有“Y”、“N”或“A”

标签: python pandas list


【解决方案1】:

最难的部分是解析国家和代码列表(A、N 或 Y)。

  • 一些国家/地区有嵌入空间(例如,萨尔瓦多)。
  • 危地马拉没有代码(所以我用了'?')

首先,编写一个函数将每个元组转换为熊猫系列。 “代码”是 A、N 或 Y。其他任何内容都是国家名称(部分)。

def raw_data_to_series(xs):
    
    name, values = xs
    
    if values == 'No Data':
        return pd.Series(dtype='object').rename(name)

    values = values.replace('  ', ' ').split(' ')

    country = ''
    results = dict()
    
    for x in values:
        if x == 'GUATEMALA':
            results[x] = '?'
            country = ''
        elif country == '':
            country = x
        elif x in {'A', 'N', 'Y'}:
            results[country] = x
            country = ''
        else:
            country = country + ' ' + x
    
    return pd.Series(results).rename(name)

现在,我们只需将res 的每个元素传递给函数(使用列表推导式):

pd.concat( [raw_data_to_series(r) for r in res], axis=1)


# first 10 lines
                 63(I)[PARA.8] 63(I)[PARA.7] 63(I)[PARA.6] 99(I) 50(I)
AFGHANISTAN                  Y             Y             Y   NaN   NaN
ARGENTINA                    Y             Y             Y   NaN   NaN
AUSTRALIA                    Y             Y             Y   NaN   NaN
BELGIUM                      Y             Y             Y   NaN   NaN
BOLIVIA                      Y             Y             Y   NaN   NaN
BRAZIL                       N             N             N   NaN   NaN
BYELORUSSIAN SSR             Y             Y             Y   NaN   NaN
CANADA                       Y             Y             Y   NaN   NaN
CHILE                        Y             Y             Y   NaN   NaN
CHINA                        A             A             A   NaN   NaN

【讨论】:

  • 非常感谢!!有一些国家像“危地马拉”这样没有价值。我将“”替换为其他值。
猜你喜欢
  • 2016-05-12
  • 2016-01-23
  • 1970-01-01
  • 1970-01-01
  • 2019-04-01
  • 2020-07-25
  • 2021-04-28
  • 2020-09-11
  • 1970-01-01
相关资源
最近更新 更多