Size: a a a

Python для анализа данных

2019 September 19

YP

Yuriy Prudnikov in Python для анализа данных
Andrey Pushvitsev
о, кстати, @goto95
тоже считаю, что циклы это зло, но есть ситуация, в которой всегда использую циклы

например, есть датафрейм с 10 колонками.
нужно все колонки кроме первой разделить на первую, и записать результат каждого деления в отдельную колонку, назвав её так же, но добавив слово "share" к имени колонки.

делаю это так, и не знаю, как это сделать не циклом
df = pd.DataFrame([[i for i in np.random.randint(1,100,10)] for z in range(1,5)])
for col in [i for i in df.columns if i!=0]:
   df[str(col)+'_share'] = df[col]/df[0]


есть тут смысл делать такое не циклом?
Я имел в виду не использовать циклы по строкам)
С колонками нет смысла заморачиваться, их как правило не много (меньше миллиона).
источник

АМ

Алексей Макаров... in Python для анализа данных
Плохо циклы по строкам делать, скорее всего, это всегда будет какой-то костыль, который решается операцией по вектору, лямбдой или на крайний случай кастомной функцией агрегации
источник

dd

dgj dfsh in Python для анализа данных
Здравствуйте!
В df есть повторяющиеся индексы, мне нужно сделать pivot_table, но тогда данные по повторяющимся индексам свернуться в cреднее, а мне нужно чтобы после  pivot_table данные не сворачивались, а остались исходными для последующего pivot_table со списком функций агрегации. Есть ли какой-то стандартный механизм-подход, чтобы перед pivot_table создать колонку с уникальным значением на основе нужных колонок индексов, которые могут повторяться?
источник

YP

Yuriy Prudnikov in Python для анализа данных
dgj dfsh
Здравствуйте!
В df есть повторяющиеся индексы, мне нужно сделать pivot_table, но тогда данные по повторяющимся индексам свернуться в cреднее, а мне нужно чтобы после  pivot_table данные не сворачивались, а остались исходными для последующего pivot_table со списком функций агрегации. Есть ли какой-то стандартный механизм-подход, чтобы перед pivot_table создать колонку с уникальным значением на основе нужных колонок индексов, которые могут повторяться?
Сделай reset_index(), и у тебя появится столбец index, в котором все значения уникальные
источник

dd

dgj dfsh in Python для анализа данных
мне нужны уникальные значения только на повторяющиеся значения нужных колонок
источник

dd

dgj dfsh in Python для анализа данных
надо избавиться от такого кода
c={}
def idx(row):
   k = (row['f1'], row['f2'], row['vt'])
   if k in c:
       c[k] += 1
   else:
       c[k] = 0
   return c[k]

df['uniqe_idx'] = df.apply(idx, axis=1)
источник

YP

Yuriy Prudnikov in Python для анализа данных
dgj dfsh
мне нужны уникальные значения только на повторяющиеся значения нужных колонок
Можно пример того, что было и того, что должно получиться?
источник

dd

dgj dfsh in Python для анализа данных
еще поясню: после первого разворачивания pivot_table нужно делать доп. операции над значениями полей, например, какое-то поле сложить с каким-то другим полем, после этого уже делать второй pivot_table с агрег. ф-ями. Если добавить именно уникальный индекс в первый pivot_table, то тогда получится что-то типа такого
    uniq_idx          
0   0         1    1  1  1   NaN   NaN    14.0
1   1         1    1  1  1  41.0   NaN     NaN
2   2         1    1  1  2   NaN   NaN    79.0
3   3         1    1  1  2   8.0   NaN     NaN
4   4         1    1  2  1   NaN   NaN    83.0
5   5         1    1  2  1  58.0   NaN     NaN
т.е. с последними тремя полями доп. операций уже нельзя провести
источник

YP

Yuriy Prudnikov in Python для анализа данных
dgj dfsh
еще поясню: после первого разворачивания pivot_table нужно делать доп. операции над значениями полей, например, какое-то поле сложить с каким-то другим полем, после этого уже делать второй pivot_table с агрег. ф-ями. Если добавить именно уникальный индекс в первый pivot_table, то тогда получится что-то типа такого
    uniq_idx          
0   0         1    1  1  1   NaN   NaN    14.0
1   1         1    1  1  1  41.0   NaN     NaN
2   2         1    1  1  2   NaN   NaN    79.0
3   3         1    1  1  2   8.0   NaN     NaN
4   4         1    1  2  1   NaN   NaN    83.0
5   5         1    1  2  1  58.0   NaN     NaN
т.е. с последними тремя полями доп. операций уже нельзя провести
Почему нельзя?
Можно пример входных и выходных данных?
И для красоты можно в ковычки оборачивать код и таблицы, вот в такие ```(над тильдой находятся)
источник

dd

dgj dfsh in Python для анализа данных
Yuriy Prudnikov
Почему нельзя?
Можно пример входных и выходных данных?
И для красоты можно в ковычки оборачивать код и таблицы, вот в такие ```(над тильдой находятся)
исходный df
f1 f2 vt v
1  1  a  1
1  1  b  2
1  1  a  1
1  1  b  2
после первого pivot_table
f1 f2 a b
1  1  1 2
1  1  1 2

т.е. нужен какой-то красивый, удобный и быстрый механизм (чем тот, пример кторого я привел выше), который сделает

uniqe_idx f1 f2 vt v
0         1  1  a  1
0         1  1  b  2
1         1  1  a  1
1         1  1  b  2


а после pivot_table
uniqe_idx f1 f2 a b
0         1  1  1 2
1         1  1  1 2
источник

YP

Yuriy Prudnikov in Python для анализа данных
dgj dfsh
исходный df
f1 f2 vt v
1  1  a  1
1  1  b  2
1  1  a  1
1  1  b  2
после первого pivot_table
f1 f2 a b
1  1  1 2
1  1  1 2

т.е. нужен какой-то красивый, удобный и быстрый механизм (чем тот, пример кторого я привел выше), который сделает

uniqe_idx f1 f2 vt v
0         1  1  a  1
0         1  1  b  2
1         1  1  a  1
1         1  1  b  2


а после pivot_table
uniqe_idx f1 f2 a b
0         1  1  1 2
1         1  1  1 2
Так устроит?
источник

YP

Yuriy Prudnikov in Python для анализа данных
источник

dd

dgj dfsh in Python для анализа данных
Yuriy Prudnikov
Так устроит?
супер! спасибо!
только не понятно, зачем после rank извлекать v? я без ['v'] сделал - все отлично! т.е. группировка у меня по f1, f2, vt
источник

YP

Yuriy Prudnikov in Python для анализа данных
dgj dfsh
супер! спасибо!
только не понятно, зачем после rank извлекать v? я без ['v'] сделал - все отлично! т.е. группировка у меня по f1, f2, vt
Если группировка по трем полям - тогда можно и без 'v', т.к. все равно остается одна колонка.
Обращайся
источник

dd

dgj dfsh in Python для анализа данных
Yuriy Prudnikov
Если группировка по трем полям - тогда можно и без 'v', т.к. все равно остается одна колонка.
Обращайся
все-таки не так работает как надо, после группировки элементы упорядочиваются и ранг назначается в соотв-вии с порядком группировки, т.е. один и тот же ранг может быть у разных значений разных индексных групп
источник

YP

Yuriy Prudnikov in Python для анализа данных
dgj dfsh
все-таки не так работает как надо, после группировки элементы упорядочиваются и ранг назначается в соотв-вии с порядком группировки, т.е. один и тот же ранг может быть у разных значений разных индексных групп
Очень странно, я вроде проверял при разных сортировках. Скинь датасет, дома буду - посмотрю
источник

dd

dgj dfsh in Python для анализа данных
Yuriy Prudnikov
Очень странно, я вроде проверял при разных сортировках. Скинь датасет, дома буду - посмотрю
{'v': {0: 14, 1: 41, 2: 79, 3: 8, 4: 83, 5: 58, 6: 47, 7: 8, 8: 33, 9: 52, 10: 15, 11: 96, 12: 58, 13: 73, 14: 50, 15: 18, 16: 30, 17: 20, 18: 94, 19: 95, 20: 71, 21: 19, 22: 53, 23: 7, 24: 77, 25: 42, 26: 76, 27: 31, 28: 40, 29: 2, 30: 86, 31: 37, 32: 30, 33: 30, 34: 30, 35: 30, 36: 30, 37: 30}, 'f1': {0: 1, 1: 1, 2: 1, 3: 1, 4: 1, 5: 1, 6: 1, 7: 1, 8: 1, 9: 1, 10: 1, 11: 1, 12: 1, 13: 1, 14: 1, 15: 1, 16: 2, 17: 2, 18: 2, 19: 2, 20: 2, 21: 2, 22: 2, 23: 2, 24: 2, 25: 2, 26: 2, 27: 2, 28: 2, 29: 2, 30: 2, 31: 2, 32: 1, 33: 1, 34: 1, 35: 1, 36: 1, 37: 1}, 'f3': {0: 1, 1: 1, 2: 1, 3: 1, 4: 2, 5: 2, 6: 2, 7: 2, 8: 1, 9: 1, 10: 1, 11: 1, 12: 2, 13: 2, 14: 2, 15: 2, 16: 1, 17: 1, 18: 1, 19: 1, 20: 2, 21: 2, 22: 2, 23: 2, 24: 1, 25: 1, 26: 1, 27: 1, 28: 2, 29: 2, 30: 2, 31: 2, 32: 1, 33: 1, 34: 1, 35: 1, 36: 1, 37: 1}, 'f2': {0: 1, 1: 1, 2: 1, 3: 1, 4: 1, 5: 1, 6: 1, 7: 1, 8: 2, 9: 2, 10: 2, 11: 2, 12: 2, 13: 2, 14: 2, 15: 2, 16: 1, 17: 1, 18: 1, 19: 1, 20: 1, 21: 1, 22: 1, 23: 1, 24: 2, 25: 2, 26: 2, 27: 2, 28: 2, 29: 2, 30: 2, 31: 2, 32: 1, 33: 1, 34: 1, 35: 1, 36: 1, 37: 1}, 'vt': {0: 'a', 1: 'b', 2: 'a', 3: 'b', 4: 'a', 5: 'b', 6: 'a', 7: 'b', 8: 'a', 9: 'b', 10: 'a', 11: 'b', 12: 'a', 13: 'b', 14: 'a', 15: 'b', 16: 'a', 17: 'b', 18: 'a', 19: 'b', 20: 'a', 21: 'b', 22: 'a', 23: 'b', 24: 'a', 25: 'b', 26: 'a', 27: 'b', 28: 'a', 29: 'b', 30: 'a', 31: 'b', 32: 'a', 33: 'b', 34: 'w', 35: 'a', 36: 'b', 37: 'w'}, 'f4': {0: 1, 1: 1, 2: 2, 3: 2, 4: 1, 5: 1, 6: 2, 7: 2, 8: 1, 9: 1, 10: 2, 11: 2, 12: 1, 13: 1, 14: 2, 15: 2, 16: 1, 17: 1, 18: 2, 19: 2, 20: 1, 21: 1, 22: 2, 23: 2, 24: 1, 25: 1, 26: 2, 27: 2, 28: 1, 29: 1, 30: 2, 31: 2, 32: 1, 33: 1, 34: 2, 35: 1, 36: 1, 37: 2}}
источник

dd

dgj dfsh in Python для анализа данных
поворот нужен по f1,f2,f3,f4, колонки по vt
источник

dd

dgj dfsh in Python для анализа данных
должно быть примерно так
vt                               b      w      a
idx f1         f2    f3   f4                    
0   1          1     1    1      41.0   NaN    14.0
                         2       8.0  30.0    79.0
                    2    1      58.0   NaN    83.0
                         2       8.0   NaN    47.0
              2     1    1      52.0   NaN    33.0
                         2      96.0   NaN    15.0
                    2    1      73.0   NaN    58.0
                         2      18.0   NaN    50.0
   2          1     1    1      20.0   NaN    30.0
                         2      95.0   NaN    94.0
                    2    1      19.0   NaN    71.0
                         2       7.0   NaN    53.0
              2     1    1      42.0   NaN    77.0
                         2      31.0   NaN    76.0
                    2    1       2.0   NaN    40.0
                         2      37.0   NaN    86.0
1   1          1     1    1      30.0   NaN    30.0
                         2       NaN  30.0     NaN
2   1          1     1    1      30.0   NaN    30.0
источник

dd

dgj dfsh in Python для анализа данных
а твое решение выдает
vt                            b      w      a
idx  f1     f2    f3   f4                    
1.0  1      1     1    1      30.0   NaN    14.0
                      2       8.0  30.0    79.0
                 2    1      58.0   NaN    83.0
                      2       8.0   NaN    47.0
           2     1    1      52.0   NaN    33.0
                      2      96.0   NaN    15.0
                 2    1      73.0   NaN    58.0
                      2      18.0   NaN    50.0
    2      1     1    1      20.0   NaN    30.0
                      2      95.0   NaN    94.0
                 2    1      19.0   NaN    71.0
                      2       7.0   NaN    53.0
           2     1    1      42.0   NaN    77.0
                      2      31.0   NaN    76.0
                 2    1       2.0   NaN    40.0
                      2      37.0   NaN    86.0
2.0  1      1     1    1      30.0   NaN    30.0
                      2       NaN  30.0     NaN
3.0  1      1     1    1      41.0   NaN    30.0
источник