首页 > 解决方案 > 如何将数据框中的列值解压缩为 Python 中的列名

问题描述

我有一个如下的数据框

Name Place                Age
Joe  [NYC, Paris, Madrid]  33
Mary [Rome]                30
Jack [Paris, Madrid]       35

我希望数据框中的输出为

Name NYC Paris Madrid Rome Age
Joe  Yes  Yes   Yes     No  33
Mary  No   No    No    Yes  30
Jack  No  Yes   Yes     No  35

我试图以各种方式做到这一点,比如

cities = ['NYC', 'Rome', 'Madrid', 'Paris']
for city in cities:
  df_city = df.apply(lambda x: x in city if x==x else False)


df[city]=df_city   //Creating a column name based on the city. But this gives an error stating array size doesn’t match

我也尝试了以下


if(city=='NYC'):
  df[city].append("True")
elif(city=='Paris'):
  df[city].append("True")
elif(city=='Madrid'):
  df[city].append("True")
else(city=='Rome'):
  df[city].append("True")

但这只会给我

Name NYC Paris Madrid Rome Age
Joe   No  Yes    No     No  33
Mary  No   No    No     No  30
Jack  No  Yes    No     No  35

提前致谢

标签: python-2.7dataframe

解决方案


试试这个,这些是操作的步骤。

  1. 逐行应用 subdf 数据帧的填充函数
  2. 迭代填充函数中每一行的值(城市名称)
  3. 检查行值(城市)是否与 bool_cities 列名称匹配(bool_cities 列是相同的城市名称)
  4. 例如“NYC”位于 subdf 的第 0 行第 0 列。所以我们可以说“NYC”应该在第 0 行。所以我们可以将 bool_cities df, “NYC” 列的第 0 位填充为 True

import pandas as pd
import numpy as np

df = pd.DataFrame([["Joe", ["NYC", "Paris", "Madrid"] , 33],
                   ["Mary", ["Rome"] ,30],
                   ["Jack", ["Paris", "Madrid"],35]])
df.columns = ["Name","Place","age"]


subdf = pd.DataFrame(df["Place"].to_list())
unique_cities = list(pd.unique(subdf.values.ravel()))
unique_cities.remove(None)
bool_cities = pd.DataFrame(np.zeros((len(df),len(unique_cities))),columns=unique_cities)

def fill(x):
    for i in x.values:
        if i in list(bool_cities.columns):
            bool_cities.loc[x.name,i]=1

subdf.apply(lambda x: fill(x),axis=1) 
bool_cities=bool_cities.astype(bool)
bool_cities = bool_cities.replace({True:"Yes", False:"No"})
result = pd.concat([df.drop("Place",axis=1),bool_cities],axis=1)

输出

   Name  age  NYC Paris Madrid Rome
0   Joe   33  Yes   Yes    Yes   No
1  Mary   30   No    No     No  Yes
2  Jack   35   No   Yes    Yes   No

推荐阅读