如果我有数据框,
df = pd.DataFrame({
'name' : ['A', 'B', 'C'],
'john_01' : [1, 2, 3],
'mary_02' : [4,5,6],
})
我想附上一个标记'#'如果列[' name']等于包含' A'和' B'。然后我可以在结果中看到类似下面的内容,是否有人知道如何以优雅的方式使用熊猫?
name_list = ['A','B','D'] # But we only have A and B in df.
john_01 mary_02 name
0 1 4 #A
1 2 5 #B
2 3 6 C
答案 0 :(得分:2)
如果name_list的长度与系列name
的长度相同,那么你可以试试这个:
df1['name_list'] = ['A','B','D']
df1.ix[df1.name == df1.name_list, 'name'] = '#'+df1.name
当name
和name_list
的值与当前索引相同时,这只会加上'#'。
In [81]: df1
Out[81]:
john_01 mary_02 name name_list
0 1 4 #A A
1 2 5 #B B
2 3 6 C D
In [82]: df1.drop('name_list', axis=1, inplace=True) # Drop assist column
如果这两个长度不一样 - 因此你不关心索引 - 那么你可以试试这个:
In [84]: name_list = ['A','B','D']
In [87]: df1.ix[df1.name.isin(name_list), 'name'] = '#'+df1.name
In [88]: df1
Out[88]:
john_01 mary_02 name
0 1 4 #A
1 2 5 #B
2 3 6 C
我希望这会有所帮助。
答案 1 :(得分:2)
使用df.loc[row_indexer,column_indexer]
运算符与isin
对象的Series
方法:
df.loc[df.name.isin(name_list), 'name'] = '#'+df.name
print(df)
输出:
john_01 mary_02 name
0 1 4 #A
1 2 5 #B
2 3 6 C
答案 2 :(得分:1)
您可以使用isin
检查名称是否在列表中,并使用numpy.where
添加#
:
df['name'] = np.where(df['name'].isin(name_list), '#', '') + df['name']
df
Out:
john_01 mary_02 name
0 1 4 #A
1 2 5 #B
2 3 6 C
答案 3 :(得分:1)
import pandas as pd
def exclude_list (x):
list_exclude = ['A','B']
if x in list_exclude:
x = '#' + x
return x
df = pd.DataFrame({
'name' : ['A', 'B', 'C'],
'john_01' : [1, 2, 3],
'mary_02' : [4,5,6],
})
df['name'] = df['name'].apply(lambda row: exclude_list(row))
print(df)