循环数据帧列以检查字典键

2024-09-30 06:18:38 发布

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

大家好,我有一个数据帧:

df1
   WM          WH         WP           LC_REF
0 Tesla     Doritos     Spiders        DT 17 1C
1 Merc      Lays        Contortion     DT 17 1C
2 Lambo     Finale        NaN          DT 17 1C
3 Reddy       Red         NaN          DT 17 1C
4 Tomball     Fools       NaN          DT 17 1C

还有一本字典

^{pr2}$

我想知道最有效的方法来检查每一列中的每一项,然后将这些列分组,这样如果列值与值“Car”或“Food”匹配,那么期望的输出是:

df2 if key matches Car

  LC_REF    vals        Category
0 DT 17 1C  Merc,Tesla    WM
1 DT 17 1C  Red, Fools    WH


df3 if key matches Food

  LC_REF    vals                 Category
0 DT 17 1C  Reddy,Tomball          WM
1 DT 17 1C  Doritos, Lays          WH
2 DT 17 1C  Spiders, Contortion    WP

目前为止

df = df.groupby('LC_REF',sort=False).agg(lambda x: ','.join(x.astype(str).str.upper()).replace(' ','')).stack().rename_axis(('LC_REF','a')).reset_index(name='vals')

是我对它们进行分组的代码,但我正在努力如何正确地将它们分开。任何对这个复杂问题的帮助都会很好。在


Tags: refdtnanwplcspiderswmmerc
1条回答
网友
1楼 · 发布于 2024-09-30 06:18:38

尝试以下操作:

import pandas as pd
import io


example = {'Fools':'Car','Red':'Car','Merc':'Car',
           'Tesla':'Car','Doritos':'Food',
           'Spiders':'Food','Reddy':'Food',
           'Tomball':'Food', 'Lays':'Food', 'Contortion': 'Food'}

# Flip the example dictionary around (keys become values and values become keys)
value_dict = {}
for k, v in example.items():
    value_dict.setdefault(v, [])
    value_dict[v].append(k)

text = u"""WM          WH         WP           LC_REF
Tesla     Doritos     Spiders       DT 17 1C
Merc      Lays        Contortion    DT 17 1C
Lambo     Finale        NaN         DT 17 1C
Reddy       Red         NaN         DT 17 1C
Tomball     Fools       NaN         DT 17 1C"""

df1 = pd.read_table(io.StringIO(text), header=0, sep="\s{2,}", engine='python')
# Melt the dataframe first
df2 = pd.melt(df1, id_vars=['LC_REF'], value_name='vals', var_name='Category')

# Get your dataframe for Food
food_df = df2.loc[df2.vals.isin(value_dict.get('Food'))].groupby(['LC_REF', 'Category']).apply(lambda x: ', '.join(x.vals)).reset_index()
print(food_df)

#      LC_REF Category                    0
# 0  DT 17 1C       WH        Doritos, Lays
# 1  DT 17 1C       WM       Reddy, Tomball
# 2  DT 17 1C       WP  Spiders, Contortion

# Get your dataframe for Car
car_df = df2.loc[df2.vals.isin(value_dict.get('Car'))].groupby(['LC_REF', 'Category']).apply(lambda x: ', '.join(x.vals)).reset_index()
print(car_df)

#      LC_REF Category            0
# 0  DT 17 1C       WH   Red, Fools
# 1  DT 17 1C       WM  Tesla, Merc

一些指导步骤:

  1. 翻转example字典:keys到值列表,value到keys。这样做有助于搜索项目。您将所有与Food相关的项放在一个列表中,将与Car相关的项放在另一个列表中。如果你想让一个的列包含一个Car项时也要遵循相同的过程。

  2. pd.melt起始数据帧(df1)。这将使数据帧处于有利于后续操作的形状(从宽到长)。

  3. 使用布尔索引获取其vals列包含Food或{}项的行。

  4. 对列LC_REF和{}使用group-by操作,然后连接vals列中的项。

我希望这有帮助。在

相关问题 更多 >

    热门问题