цикл по фрейму данных pandas для замены существующих значений, использующих цикл for - PullRequest
0 голосов
/ 04 ноября 2019

Проблема: Я пытаюсь пройтись по циклу данных, строка за строкой, используя цикл for. Но это не работает, как хотелось бы. Я знаю, что есть iterrows () и itertuple (), с которыми я хочу поэкспериментировать для цикла for.

Можете ли вы сказать мне, где это не так?

пример данных

data3 = {"one":['101', '102', '103' , '104'],
     "two":['101', '105', '106', '104'],
     "three": ['102', '5', '107', '108'],
     "other": ['101', '102', '103' , '104']
     }
df3 = pd.DataFrame(data3)

Цель: проверить столбец «два» в каждой строке,и если значение столбца 'two' существует в столбце 'one', то создайте новый столбец 'new_col' со значением 'del'. Если значение не существует в столбце «one», создайте «new_col» как «keep». Например, если столбец 'two' имеет 101, я хочу сравнить его со всеми значениями столбца 'one'

мой код:

dfToList1 = df3['two'].tolist()
for x in dfToList1:
   if x in df3['one'].values:
       df3['new_col'] = 'del'
   else:
       df3['new_col'] = 'keep'

затемЯ могу заменить значение в 'two', которое соответствует 'one', строкой типа 'none'

df3.loc[df3['new_col'] == 'del', 'two'] = 'none'

мой вывод:

В идеале во 2-м и3-й ряд, 5 и 107 в 'two' не включают в 'one', и поэтому new_col во 2-м и 3-м ряду должен иметь значение 'keep', но я его не получаю.

    one other   three   two new_col
0   101 101     102     101     del
1   102 102       5     105     del
2   103 103     107     106     del
3   104 104     108     104     del

ожидаемый результат

    one other   three   two  new_col
0   101 101     102     101     del
1   102 102       5     105     keep
2   103 103     107     106     keep
3   104 104     108     104     del

Ответы [ 2 ]

0 голосов
/ 04 ноября 2019

Используйте np.where с Series.eq и Series.isin для проверки.

df3['newcol']=np.where(~df3.two.isin(df3.one),'keep','del')

или длявыберите по столбцам «один» с любым общим значением со столбцом два:

df3['newcol']=np.where(~df3.one.isin(df3.loc[df3.two.eq(df3.one),'two']),'keep','del')
print(df3)

   one  two three other newcol
0  101  101   102   101    del
1  102  105     5   102   keep
2  103  106   107   103   keep
3  104  104   108   104    del

Подробности

two_coincident_one=df3.loc[df3.two.eq(df3.one),'two']
print(two_coincident_one)
0    101
3    104
Name: two, dtype: object


~df3.one.isin(two_coincident_one)

0    False
1     True
2     True
3    False
Name: one, dtype: bool
0 голосов
/ 04 ноября 2019

Использование np.where:

df3['new_col'] = np.where(df3['two'].isin(df3['one']), 'del', 'keep')

Результат:

   one  two three new_col
0  101  101   102     del
1  102  105     5    keep
2  103  106   107    keep
3  104  104   108     del
...