Создайте новый столбец, используя различные условия для нечетных и четных строк в панде. - PullRequest
0 голосов
/ 04 декабря 2018

У меня есть следующий pandas dataframe:

     A       B
0   16.3    1.10
1   23.2    1.33
2   10.7   -0.43
3   5.7    -2.01
4   5.4    -1.86
5   23.5    3.14

Я хотел бы создать третий столбец, сравнив значения в столбце A в 2 смежных строках и сделав то же самое для следующих 2и т. д.

Возможно, это немного сбивает с толку, поэтому я приведу пример:

  • Для первой строки, если 16.3 - 23.2 < 5, то значение первой строкиновый столбец C должен быть Bad, если эта разница равна ==5, тогда новый столбец должен быть Decent и Good, если разница составляет >5
  • Для второй строки:примените ту же логику, но вместо этого используйте 23.2 - 16.3 и сгенерируйте значение C для этой строки из этой разницы
  • Сделайте то же самое для строк 3 и 4 как пары, 5 и 6 какпара и так далее

Таким образом, результирующий кадр данных должен быть следующим:

     A       B      C
0   16.3    1.10   Bad
1   23.2    1.33   Good
2   10.7   -0.43   Decent
3   5.7    -2.01   Bad
4   5.4    -1.86   Bad
5   23.5    3.14   Good

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

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

Однако я не могу понять, как можно применить обе функции вместе для генерации столбца C.

Как я могу это реализовать, или еслиэто простое решение, как это можно сделать?

1 Ответ

0 голосов
/ 04 декабря 2018

Вы можете использовать numpy.select с numpy.isclose для сравнения чисел с плавающей запятой, потому что для точности, для поменянных значений создайте вспомогательный DataFrame.

Примечание:
Решение, работающее для числа пар строк.

print (df)
      A      B
0  16.3   1.10
1  23.2   1.33
2  10.7  -0.43
3   5.7  -2.01
4   5.4  -1.86
5  23.5   3.14
6  11.7   4.00
7  24.9  10.00

#create default Rangeindex
df = df.reset_index(drop=True) 

#MultiIndex by integer and modulo division with reshape
df1 = df.set_index([df.index // 2, df.index % 2]).unstack()
#subtract first values with second in MultiIndex
df1 = df1.xs(0, axis=1, level=1) - df1.xs(1, axis=1, level=1)
#join together with multiplied df by -1
df1 = pd.concat([df1, df1 * -1]).sort_index().reset_index(drop=True)
print (df1)
      A     B
0  -6.9 -0.23
1   6.9  0.23
2   5.0  1.58
3  -5.0 -1.58
4 -18.1 -5.00
5  18.1  5.00
6 -13.2 -6.00
7  13.2  6.00

masks = [np.isclose(df1, 5), df1.values < 5]
vals = ['Decent','Bad']

#create new df and join to original
df = df.join(pd.DataFrame(np.select(masks, vals, 'Good'), columns=df.columns).add_suffix('_new'))
print (df)
      A      B   A_new   B_new
0  16.3   1.10     Bad     Bad
1  23.2   1.33    Good     Bad
2  10.7  -0.43  Decent     Bad
3   5.7  -2.01     Bad     Bad
4   5.4  -1.86     Bad     Bad
5  23.5   3.14    Good  Decent
6  11.7   4.00     Bad     Bad
7  24.9  10.00    Good    Good
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...