如何在满足条件时标记行?

时间:2016-12-11 21:06:29

标签: python pandas

如果我有数据框,

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

4 个答案:

答案 0 :(得分:2)

如果name_list的长度与系列name的长度相同,那么你可以试试这个:

df1['name_list'] = ['A','B','D']
df1.ix[df1.name == df1.name_list, 'name'] = '#'+df1.name

namename_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

http://pandas.pydata.org/pandas-docs/stable/indexing.html

答案 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)