pandas 如果列表中的值位于不同DataFrame的行中,如何在Python中创建DataFrame?

enxuqcxy  于 2022-11-20  发布在  Python
关注(0)|答案(2)|浏览(142)

我有一个示例 Dataframe :

| ID | SampleColumn1| SampleColumn2 | SampleColumn3 |
|:-- |:------------:| ------------ :| ------------  |
| 1  |sample Apple  | sample Cherry |sample Lime    |
| 2  |sample Cherry | sample lemon  | sample Grape  |

我想创建一个基于初始 Dataframe 的新 Dataframe 。如果列表中的某个值[Apple,Lime,Cherry]出现在某行的任何列中,则在新 Dataframe 中该列的值将显示为1。在这种情况下,输出应为:

| ID | Apple | Lime | Cherry |
| 1  |  1    |  1   |    1   |
| 2  |  0    |  0   |    1   |

目前我已经尝试过对字符串使用find函数,将一个序列转换为每行的字符串,然后如果返回的值等于新 Dataframe 的列名,则使用if条件。在这方面,我遇到了一个逻辑错误。

ulmd4ohb

ulmd4ohb1#

试试这个:

keywords = ['Apple', 'Lime', 'Cherry']
tmp = (df.melt(ignore_index=False)
       .value.str.extract(
           f'({"|".join(keywords)})',
           expand=False)
       .dropna())

res = (pd.crosstab(index=tmp.index, columns=tmp)
       .rename_axis(index=None, columns=None))
print(res)
>>>
    Apple   Cherry  Lime
1   1       1       1
2   0       1       0
pbossiut

pbossiut2#

可以创建一个函数来替换包含所需子字符串的字符串,然后使用pd.get_dummies()

fruits = ['Apple', 'Lime', 'Cherry']
def replace_fruit(string):
    for fruit in fruits:
        if fruit in string:
            return fruit
    return None

pd.get_dummies(df.set_index('ID').applymap(replace_fruit), prefix='', prefix_sep='').groupby(level=0, axis=1).sum().reset_index()

相关问题