Если у меня есть датафрейм,

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
1
Sakura 12 Дек 2016 в 00:06

4 ответа

Лучший ответ

Если name_list имеет ту же длину, что и длина Series 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

Надеюсь, это поможет.

2
Thanos 11 Дек 2016 в 21:32

Вы можете использовать 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
1
ayhan 11 Дек 2016 в 21:12

Используйте оператор 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
RomanPerekhrest 11 Дек 2016 в 21:47
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)
1
Danil.V 11 Дек 2016 в 21:57