pandas get_dummies在具有多个条目的行上

xhv8bpkk  于 2023-08-01  发布在  其他
关注(0)|答案(4)|浏览(107)

如果我有一个像这样的数据框架:
| Fruits |
| ------------ |
| apple, banana, strawberry |
| apple |
| strawberry, apple |
我很难为这样的东西创建虚拟列,因为它可能在每行有多个水果。这将是我想要的结果:
| 香蕉|草莓| strawberry |
| --|--| ------------ |
| 1| 1| 1 |
| 0| 0| 0 |
| 0| 1| 1 |
尝试get_dummies函数本身并不起作用,因为它将创建如下列:
| 苹果|草莓,苹果| strawberry,apple |
| --|--| ------------ |
| 0| 0| 0 |
| 1| 0| 0 |
| 0| 1| 1 |
任何帮助都是赞赏的,谢谢!

fiei3ece

fiei3ece1#

这里有一种方法,使用我在评论中提到的技术:

import pandas as pd
data = [
    ['apple, banana, strawberry'],
    ['apple'],
    ['strawberry, apple']
]

df = pd.DataFrame(data, columns=['Fruits'])
print(df)

columns = set()
for row in df['Fruits'].to_list():
    columns |= set( row.split(', ') )

rows = []
for row in df['Fruits'].to_list():
    rows.append( [int(c in row) for c in columns] )

columns = list(columns)
df = pd.DataFrame(rows, columns=columns)
print(df)

字符串
输出量:

Fruits
0  apple, banana, strawberry
1                      apple
2          strawberry, apple
   apple  banana  strawberry
0      1       1           1
1      1       0           0
2      1       0           1

ff29svar

ff29svar2#

你可以这样做

dummy_df = df["Fruits"].str.get_dummies(", ")

字符串
产出

apple banana strawberry
0     1      1          1
1     1      0          0
2     1      0          1

juzqafwq

juzqafwq3#

在pandas上使用get_dummies函数为每行中的多个条目创建虚拟列,所以基本上通过分隔符(逗号)将条目拆分为fruits列,然后应用到get_dummies,这样我们就可以了:

import pandas as pd

# Create the sample dataframe
df = pd.DataFrame({'Fruits': ['apple, banana, strawberry', 'apple', 'strawberry, apple']})

# Split the entries in the 'Fruits' column by comma and apply get_dummies
dummies = df['Fruits'].str.split(', ', expand=True).stack().str.get_dummies().sum(level=0)

# Join the dummies dataframe with the original dataframe
result = df.join(dummies)

print(result)

字符串
希望有用,谢谢,

mgdq6dx1

mgdq6dx14#

您也可以在标准库的帮助下这样做,以获得整洁漂亮的代码。

from itertools import chain

def create_dummy(df: pd.DataFrame) -> pd.DataFrame:
    # Get list of all unique fruits
    fruits_series = df["Fruits"].str.split(", ")
    unique_fruits = set(chain.from_iterable(fruits_series))

    # Create dummy DataFrame
    tdf = pd.DataFrame(0,
                       columns=list(unique_fruits),
                       index=df.index,
                       dtype=pd.UInt8Dtype)

    # Update labels
    for ind, targets in zip(df.index, fruits_series):
        tdf.loc[ind, targets] = 1

    return tdf

字符串
用途:

df = pd.DataFrame(["apple, orange, grape", 
                   "apple", 
                   "banana, strawberry"], columns=["Fruits"])
print(create_dummy(df))


输出量:

grape  strawberry  orange apple banana
 0      1           0       1     1      0
 1      0           0       0     1      0
 2      0           1       0     0      1


python==3.10.8pandas==1.5.2上测试。

相关问题