Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 基于另一列在dataframe中创建列_Python_Pandas - Fatal编程技术网

Python 基于另一列在dataframe中创建列

Python 基于另一列在dataframe中创建列,python,pandas,Python,Pandas,我有一个数据框,其中一列只包含字符串 df= pd.DataFrame( { "A": [2,4,7,17,39], "B": ["apple","apple","broccoli","rose","apple"] } ) 我想检查这个列“B”,查找字符串包含单词某个部分的所有时间。然后我创建了一个新的列“C”,其中包含一系列字符串,每当“app”在行中时都会显示“fruit”,每当“ros”出现时都会显示“flower”,每当“brocc”出现时都会显示“veget

我有一个数据框,其中一列只包含字符串

df= pd.DataFrame(
  {
    "A": [2,4,7,17,39], 
    "B": ["apple","apple","broccoli","rose","apple"]
  }
)
我想检查这个列“B”,查找字符串包含单词某个部分的所有时间。然后我创建了一个新的列“C”,其中包含一系列字符串,每当“app”在行中时都会显示“fruit”,每当“ros”出现时都会显示“flower”,每当“brocc”出现时都会显示“vegeture”

最终的数据帧将如下所示:

df= pd.DataFrame(
  {
    "A": [2,4,7,17,39], 
    "B": ["apple","apple","broccoli","rose","apple"], 
    "C": ["fruit","fruit", "vegetable", "flower", "fruit"]
  }
)

您可以使用字典作为转换器,它的
get
方法作为
apply
的输入:

converter = {'apple': 'fruit',
             'broccoli': 'veg',
             'rose': 'flower'}

df['C'] = df['B'].apply(converter.get)
print(df)
    A         B       C
0   2     apple   fruit
1   4     apple   fruit
2   7  broccoli     veg
3  17      rose  flower
4  39     apple   fruit
在部分匹配的情况下,您需要对此进行一点更改:

converter = {'app': 'fruit',
             'brocc': 'vegetable',
             'ros': 'flower'}

df['C'] = df['B'].apply(lambda original: next(val for key, val in converter.items() if key in original))
print(df)
    A         B          C
0   2     apple      fruit
1   4     apple      fruit
2   7  broccoli  vegetable
3  17      rose     flower
4  39     apple      fruit
接下来的
命令(val代表key,val在converter.items()中,如果key在original中)
将从字典中为“row”中找到的第一个key提供值。

创建一个字典

d = {'apple': 'fruit', 'broccoli': 'vegetable', 'rose': 'flower'}
并在
映射
替换
中使用它(映射速度更快):


我稍微编辑了这个问题,这样就不需要实体的全名了。这会改变你提供的答案吗?@John你通常不应该以非琐碎的方式改变问题(特别是如果你可以使答案无效的话)。改为问一个新问题。@John不,这不适用于部分匹配。这个问题的规则不是很清楚。单词的各个部分是事先确定的吗?例如,你能像这样构建一个字典吗?或者,是否要使用此字典,但如果存在部分匹配,则返回一个值?对于后者,您需要澄清什么样的匹配是可以接受的。如果只有
o
,会发生什么情况?这是一种蔬菜还是一朵花?我也同意,一个新的问题会更好。
df['B'].map(d)
Out: 
0        fruit
1        fruit
2    vegetable
3       flower
4        fruit
Name: B, dtype: object

df['B'].replace(d)
Out: 
0        fruit
1        fruit
2    vegetable
3       flower
4        fruit
Name: B, dtype: object