Pandas итерация по нескольким строкам в одном столбце .... как избежать 40+ операторов elif? - PullRequest
0 голосов
/ 06 марта 2020

У меня есть CSV-файл, 78 столбцов на 400 000. Ниже приведен упрощенный пример: '' '

df=pd.DataFrame({'X':[1,2,3,4],
                 'Y':[0,0,1,1],
                 'Z':[0,0,0,0],
          'Location':[1,2,3,4],
             'Data1':[123,645,324,876]
             'Data2':[733,347,547,764]
             'Data3':[245,846,435,099]
             'Data4':[748,664,222,810]}

' ''

Избавьтесь от устаревшего ключа lo c при попытке использовать ключи для столбцов: '' '

headers=df.keys().tolist()
df=df.reindex(columns=headers)

'' '

Мне нужно создать вывод, который повторяет X, Y, Z для каждого значения «Местоположение», вращая «Данные1» - «Данные4».

Кажется, что функция плавления хороша для этого,

'' '

df2=pd.melt(df, id_vars=['X','Y','Z'], value_vars=['Location', 'Data1', 'Data2', 'Data3', 'Data4'], value_name='Measurements')

' '' Получите нужный мне формат данных перед математическим преобразованием. '' '

X        Y        Z        variable        Measurements
1        0        0        Data1           123
2        0        0        Data1           645

... (Many Rows Later)

4        1        0        Data4           810

' ''

Теперь мне нужно сделать реальную математику, что этот вопрос о

Как у меня 48 типы переменных из Data1-Data48. Мне нужно изменить поле Z, каким бы ни было поле данных (я создаю облако точек для некоторого геологического моделирования / визуализации). Единственный способ, которым я могу подумать, это сделать 48 операторов if и вычислить каждое из них в al oop и добавить к столбцу Z соответствующее смещение ...

Теперь это кажется неэффективным, и есть Должен быть другой путь, я пытался найти выход из этого положения, и мне совсем не повезло.

Ответы [ 2 ]

0 голосов
/ 09 марта 2020

Спасибо, это сработало, как только я получил все типы данных в моем файле.

Единственный оставшийся сбой - понимание синтаксиса

    'df2['Z'] += df2.merge(aux, how='left', on='variable')['offset']'

.

Это, наверное, очень фундаментальное понимание, которого я здесь упускаю.

Почему бы не работать как 'df2 [' Z '] + = df2 [' offset ']. Merge (aux , how = 'left', on = 'variable') '?

Может кто-нибудь дать немного больше объяснения того, как функция слияния работает со списком, присоединенным к его концу? Это в конечном итоге является простым умножением?

0 голосов
/ 06 марта 2020

Предположим, что у вас есть словарь, сопоставляющий поле variable со смещением:

delta = {'Data1': 3, 'Data2': 5, 'Data3': 7, 'Data4': 9, 'Location': 0}

Мы можем построить из него вспомогательный фрейм данных:

aux = pd.Series(delta, name='offset').to_frame().rename_axis('variable').reset_index()

Это дает здесь:

   variable  offset
0     Data1       3
1     Data2       5
2     Data3       7
3     Data4       9
4  Location       0

Теперь мы можем просто добавить соответствующее смещение к полю Z векторизованным способом:

df2['Z'] += df2.merge(aux, how='left', on='variable')['offset']

, чтобы получить:

    X  Y  Z  variable  Measurements
0   1  0  0  Location             1
1   2  0  0  Location             2
2   3  1  0  Location             3
3   4  1  0  Location             4
4   1  0  3     Data1           123
5   2  0  3     Data1           645
6   3  1  3     Data1           324
7   4  1  3     Data1           876
8   1  0  5     Data2           733
9   2  0  5     Data2           347
10  3  1  5     Data2           547
11  4  1  5     Data2           764
12  1  0  7     Data3           245
13  2  0  7     Data3           846
14  3  1  7     Data3           435
15  4  1  7     Data3            99
16  1  0  9     Data4           748
17  2  0  9     Data4           664
18  3  1  9     Data4           222
19  4  1  9     Data4           810
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...