【问题标题】:How to change dataframe from long to wide shape without losing duplicated values?如何在不丢失重复值的情况下将数据框从长形更改为宽形?
【发布时间】:2023-01-15 16:18:19
【问题描述】:

我给出了示例数据框:

import pandas as pd


df = pd.DataFrame({
            'company_name': ['do holdings co', 'real estate b.v.', 'real estate b.v.','real coiffure', 'real coiffure', 'elendom', 'theatre media ltd'],
            'sector_1': ['Industrials', 'Finance', 'Finance','Consumer', 'Consumer','Real Estate', 'Media'],
            'company_country': ['USA', 'Poland', 'Poland','USA','USA', 'Poland', 'Canada'],
            'keyword': ['holding', 'real', 'estate','real','coiffure', 'elendom', 'theatre'],
            'value': [1,1,1,1,1,1,1],
            'sector': ['Finance', 'Real Estate', 'Real Estate', 'Real Estate', 'Consumer', 'Real Estate', 'Media']
})

我正在检查公司名称中是否存在关键字,如果存在 - 我正在为它们分配匹配的扇区(列扇区,sector_1 - 请暂时忽略)。

我有一个关键字列表,你可以看到它们在关键字列中重复 - 因为我正在检查每个公司。我已经过滤掉出现次数为 0 的关键字。

我想将表格更改为宽格式,但我们有重复的关键字 - 然后分配两个扇区,结果应如下所示:

df_results = pd.DataFrame({
            'company_name': ['do holdings co', 'real estate b.v.', 'real coiffure', 'elendom', 'theatre media ltd'],
            'sector_1': ['Industrials', 'Finance','Consumer', 'Real Estate', 'Media'],
            'company_country': ['USA', 'Poland','USA', 'Poland', 'Canada'],
            'holding': [1,0,0,0,0],
            'real': [0,1,1,0,0],
            'estate': [0,1,0,0,0],
            'coiffure': [0,0,1,0,0],
            'elendom': [0,0,0,1,0],
            'theatre': [0,0,0,0,1],
            'sector': ['Finance', ['Real Estate', 'Real Estate'],['Real Estate', 'Consumer'], 'Real Estate', 'Media']
    })

我在执行此任务时遇到问题,感谢您的帮助。

编辑:

这就是我一直在尝试的,虽然还不完美,但已经差不多了:

df_wide = pd.crosstab(index=df['company_name'], columns=df['keyword'], values=df['value'], aggfunc='sum')
df_wide['sector'] = df.groupby('company_name')['sector'].apply(lambda x: list(set(x)))
df_results = pd.merge(df_wide, df[['company_name','sector_1','company_country']], on='company_name', how='left')

【问题讨论】:

  • 如果您的问题没有更多背景信息,我会怀疑您的目标数据框df_results 是否是一个好方法。那是因为它是一个非常不标准的数据结构。你能提供更多关于你将如何使用df_results的信息吗?

标签: python pandas dataframe formatting dummy-variable


【解决方案1】:

这是使用 Pandas groupbyapplyget_dummies 执行此操作的一种方法:

# Group rows
df = df.groupby(["company_name"]).agg(list).drop(columns="value")

# Remove duplicated values
for col in ["sector_1", "company_country"]:
    df[col] = df[col].apply(lambda x: list(set(x))[0])

# Remove lists of one value in 'sector' column
df["sector"] = df["sector"].apply(lambda x: x[0] if len(x) == 1 else x)

# Get dummies and add columns to dataframe
dummies = pd.get_dummies(df["keyword"].apply(pd.Series).stack()).groupby(level=0).sum()
df = pd.concat([df, dummies], axis=1).drop(columns="keyword").reset_index()

# Reorder columns
df = df.reindex([col for col in df.columns if col != "sector"] + ["sector"], axis=1)

然后:

print(df)
# Output

        company_name     sector_1 company_country  coiffure  elendom  estate  
0     do holdings co  Industrials             USA         0        0       0   
1            elendom  Real Estate          Poland         0        1       0   
2      real coiffure     Consumer             USA         1        0       0   
3   real estate b.v.      Finance          Poland         0        0       1   
4  theatre media ltd        Media          Canada         0        0       0   

   holding  real  theatre                      sector  
0        1     0        0                     Finance  
1        0     0        0                 Real Estate  
2        0     1        0     [Real Estate, Consumer]  
3        0     1        0  [Real Estate, Real Estate]  
4        0     0        1                       Media  

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-10-23
    • 2023-03-08
    • 2021-05-28
    • 1970-01-01
    • 1970-01-01
    • 2019-03-29
    • 2017-06-18
    • 1970-01-01
    相关资源
    最近更新 更多