Использование списка в качестве строки имени и элементов в списке - PullRequest
0 голосов
/ 22 ноября 2018

Есть ли способ составить список списков, а затем просмотреть их.

По сути, мне нужно использовать элементы нескольких списков в качестве условия, но также использовать имя в качестве строки / столбцаname.

Я знаю, что приведенный ниже пример можно сделать более простым способом, но я думаю, что он требует этого подхода, поскольку моя задача немного сложнее, чем приведенная ниже

 df=

    name
0   Alice
1   Fred
2   George

male=['fred','george']
female=['alice','emily']


alllists=[male, female]

for i in alllists:
    df[i]=0

    df.loc[df['Name'].str.contains('|'.join(i),na=False),l]=1

Output df

    name    Male   Female  
0   Alice    0      1      
1   Fred    1       0      
2   George  1        0   

Ответы [ 2 ]

0 голосов
/ 22 ноября 2018

Вы можете использовать pandas.get_dummies.

>>> males = {'fred', 'george'}
>>> fm = pd.get_dummies(['Male' if name.lower() in males else 'Female' for name in df['name']])
>>> result = pd.concat([df, fm], axis=1)
>>> 
>>> result
     name  Female  Male
0   Alice       1     0
1    Fred       0     1
2  George       0     1

Это можно сделать намного более элегантно, используя лучшую структуру данных, например dict, для сопоставления имен с полами:

>>> sex = {'Fred': 'Male', 'George': 'Male', 'Alice': 'Female', 'Emily': 'Female'}
>>> result = pd.concat([df, pd.get_dummies(df['name'].map(sex))], axis=1)
>>> result
     name  Female  Male
0   Alice       1     0
1    Fred       0     1
2  George       0     1

Если начать с

male = ['fred','george']
female = ['alice','emily']

, вы можете построить sex следующим образом:

>>> sex = {name.capitalize():s for names, s in [(male, 'Male'), (female, 'Female')]
...:                           for name in names}
...:                           
>>> sex
{'Alice': 'Female', 'Emily': 'Female', 'Fred': 'Male', 'George': 'Male'}

Наконец, если порядок столбцовважно, вы можете переиндексировать результат.

>>> result = result.reindex(columns=['name', 'Male', 'Female'])
>>> result
     name  Male  Female
0   Alice     0       1
1    Fred     1       0
2  George     1       0
0 голосов
/ 22 ноября 2018

Пока есть способ, не рекомендуется.Просто используйте словарь:

d = {'male': ['fred', 'george'],
     'female': ['alice', 'emily']}

for k, v in d.items():
    mask = df['name'].str.lower().str.contains('|'.join(v), na=False)
    df[k.capitalize()] = mask.astype(int)

mask.astype(int) работает, потому что логический массив может быть отображен непосредственно в 1 / 0, так же как bool является подклассом int в обычном Python.

Результат:

print(df)

     name  Male  Female
0   Alice     0       1
1    Fred     1       0
2  George     1       0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...