从其他列中匹配的单词创建列

2024-09-29 22:43:45 发布

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

我有一个数据框,有几个实质列,如下所示:

import random

values = ['oil', 'gas', 'water']
modifier = ['dirty', 'crude', 'fuel']
wordzip = [modifier, values]

data = [[wordzip[0][random.randint(0,2)] + ' ' + wordzip[1][random.randint(0,2)] for c in wordzip[0]] for i in range(7)]

pd.DataFrame(data = data, columns = ['A', 'B', 'C'])

             A            B            C   
0    dirty gas    crude oil  dirty water 
1  dirty water     fuel gas    dirty gas  
2  dirty water     fuel gas    dirty oil  
3     fuel oil  crude water    crude gas  
4  dirty water     fuel oil  dirty water  
5    crude oil   fuel water    dirty oil
6   fuel water    crude gas  crude water 

我想在包含单词“oil”的列上创建一个新列,其中的值在中。所以最后的df应该是这样的:

             A            B            C          D
0    dirty gas    crude oil  dirty water  crude oil
1  dirty water     fuel gas    dirty gas  NaN
2  dirty water     fuel gas    dirty oil  dirty oil
3     fuel oil  crude water    crude gas  fuel oil
4  dirty water     fuel oil  dirty water  fuel oil
5    crude oil   fuel water    dirty oil  crude oil
6   fuel water    crude gas  crude water  NaN

我尝试了df[['A', 'B', 'C']].apply(lambda x: x.str.contains('oil')),但它返回的是布尔数据帧,而不是值本身。你知道吗


Tags: 数据infordatarandomvaluesmodifierrandint
3条回答

像这样:

import pandas as pd
import random

values = ['oil', 'gas', 'water']
modifier = ['dirty', 'crude', 'fuel']
wordzip = [modifier, values]
data = [[wordzip[0][random.randint(0,2)] + ' ' + wordzip[1][random.randint(0,2)] for c in wordzip[0]] for i in range(7)]
df=pd.DataFrame(data = data, columns = ['A', 'B', 'C'])

temp=df[df[['A', 'B', 'C']].apply(lambda x: x.str.contains('oil'))]
df['D'] = temp.A.combine_first(temp.B).combine_first(temp.C)

让我们使用stack+extract

df['D'] = df.stack().str.extract(r'(.* oil)').groupby(level=0).first()[0]
df
             A            B            C          D
0    dirty gas    crude oil  dirty water  crude oil
1  dirty water     fuel gas    dirty gas        NaN
2  dirty water     fuel gas    dirty oil  dirty oil
3     fuel oil  crude water    crude gas   fuel oil
4  dirty water     fuel oil  dirty water   fuel oil
5    crude oil   fuel water    dirty oil  crude oil
6   fuel water    crude gas  crude water        NaN

bfill一起使用applymap

df[df.applymap(lambda x : 'oil' in x)].bfill(1).loc[:,'A']
Out[80]: 
0          NaN
1          NaN
2     fuel oil
3    crude oil
4    crude oil
5     fuel oil
6          NaN
Name: A, dtype: object

相关问题 更多 >

    热门问题