Изменить значения в столбце на основе условия другого - PullRequest
0 голосов
/ 27 июня 2018

Вопрос: Как вы группируете df на основе переменной, производите вычисления, используя цикл for?

Задача состоит в том, чтобы сделать условное вычисление на основе значения в столбце. Но вычислительные константы зависят от значения в справочном столбце. Учитывая это df:

In [55]: df = pd.DataFrame({
    ...:     'col1' : ['A', 'A', 'B', np.nan, 'D', 'C'],
    ...:     'col2' : [2, 1, 9, 8, 7, 4],
    ...:     'col3': [0, 1, 9, 4, 2, 3],
    ...: })

In [56]: df
Out[56]: 
  col1  col2  col3
0    A     2     0
1    A     1     1
2    B     9     9
3  NaN     8     4
4    D     7     2
5    C     4     3

Я использовал решение здесь , чтобы вставить столбец 'math', который берет остаток от col3 и добавляет 10. Но теперь я хочу перебрать список, чтобы установить зависимость от вычислительной переменной на значения в col1. Вот результат:

In [57]: items = ['A', 'D']

In [58]: for item in items:
    ...:     df.loc[:, 'math'] = df.loc[df['col1'] == item, 'col3']
    ...:     

In [59]: df
Out[59]: 
  col1  col2  col3  math
0    A     2     0   NaN
1    A     1     1   NaN
2    B     9     9   NaN
3  NaN     8     4   NaN
4    D     7     2   2.0
5    C     4     3   NaN

Очевидная проблема заключается в том, что df перезаписывается на каждой итерации. Столбец math для индексов 0 и 1 вычисляет значения на первой итерации, но они удаляются на второй итерации. В результате df учитывает только последний элемент списка.

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

Ожидаемый результат для .mul() примера

In [100]: df
Out[100]: 
  col1  col2  col3  math
0    A     2     0   0.0
1    A     1     1  10.0
2    B     9     9   NaN
3  NaN     8     4   NaN
4    D     7     2  20.0
5    C     4     3   NaN

Ответы [ 2 ]

0 голосов
/ 27 июня 2018

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

Выделите все строки с элементами в items и присвойте их так же, как вы делали раньше.

df['math'] = df.loc[df.col1.isin(items), 'col3'] * 10

Или,

df['math'] = df.query("col1 in @items").col3 * 10

Или даже,

df['math'] = df.col3.where(df.col1.isin(items)) * 10

df

  col1  col2  col3  math
0    A     2     0   0.0
1    A     1     1  10.0
2    B     9     9   NaN
3  NaN     8     4   NaN
4    D     7     2  20.0
5    C     4     3   NaN
0 голосов
/ 27 июня 2018

Причина, по которой вы терпите неудачу с назначением, приводит к тому, что в каждом цикле for вы присваиваете Math с новым значением, как показано ниже, которое будет показывать только последнее и представлять результат после цикла for

0     0.0
1    10.0
2     NaN
3     NaN
4     NaN
5     NaN
Name: col3, dtype: float64
0     NaN
1     NaN
2     NaN
3     NaN
4    20.0
5     NaN
Name: col3, dtype: float64

Вы можете сделать это ниже

df.loc[df.col1.isin(items),'math']=df.col3*10
df
Out[85]: 
  col1  col2  col3  math
0    A     2     0   0.0
1    A     1     1  10.0
2    B     9     9   NaN
3  NaN     8     4   NaN
4    D     7     2  20.0
5    C     4     3   NaN
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...