как объединить / использовать строки для выполнения команд в python / pandas - PullRequest
1 голос
/ 14 мая 2019

Я хотел бы использовать строки "команд" для автоматизации некоторых панд-анализа.

что-то вроде:

str_a = 'df.col_1.isna()'   
str_b = ' & '    
str_c = 'df.col_2.isna()'    
str_tot = str_a + str_b + str_c

затем используйте строку для сортировки NaN-строк в df:

df.loc[str_tot, :]

этот последний должен быть равен:

df.loc[df.col_1.isna() & df.col_2.isna(), :]

но компилятор python читает str_tot как [список], а не как строку, возвращая ошибку.

Есть ли способ обойти это?


спасибо

Я привык к этому в VBA для построения строк SQL ... это неправильная идея в python?

Ответы [ 2 ]

3 голосов
/ 14 мая 2019

Закрыть, вам нужно DataFrame.query, но при необходимости работать с Series.isna добавить параметр engine='python':

df = pd.DataFrame({
        'A':list('abcdef'),
         'col_1':[np.nan,5,4,5,5,4],
         'C':[7,8,9,4,2,3],
         'col_2':[np.nan,3,5,7,1,np.nan],
         'E':[5,3,6,9,2,4],
         'F':list('aaabbb')
})

print (df)
   A  col_1  C  col_2  E  F
0  a    NaN  7    NaN  5  a
1  b    5.0  8    3.0  3  a
2  c    4.0  9    5.0  6  a
3  d    5.0  4    7.0  9  b
4  e    5.0  2    1.0  2  b
5  f    4.0  3    NaN  4  b

str_a = 'col_1.isna()'

str_b = ' & '

str_c = 'col_2.isna()'

str_tot = str_a + str_b + str_c
print (str_tot)
col_1.isna() & col_2.isna()

print (df.query(str_tot, engine='python'))
   A  col_1  C  col_2  E  F
0  a    NaN  7    NaN  5  a

Другая идея - это факт использования np.nan == np.nan - это False, документы :

str_a = '(col_1 != col_1)'

str_b = ' & '

str_c = '(col_2 != col_2)'

str_tot = str_a + str_b + str_c
print (str_tot)
(col_1 != col_1) & (col_2 != col_2)

print (df.query(str_tot))
   A  col_1  C  col_2  E  F
0  a    NaN  7    NaN  5  a
0 голосов
/ 14 мая 2019

В качестве альтернативы вы можете использовать python eval.

str_a = 'df.col_1.isna()'
e = eval(str_a)
print(e)

Для верхнего примера:

df = pd.DataFrame({
        'A':list('abcdef'),
         'col_1':[np.nan,5,4,5,5,4],
         'C':[7,8,9,4,2,3],
         'col_2':[np.nan,3,5,7,1,np.nan],
         'E':[5,3,6,9,2,4],
         'F':list('aaabbb')
})

print (df)
   A  col_1  C  col_2  E  F
0  a    NaN  7    NaN  5  a
1  b    5.0  8    3.0  3  a
2  c    4.0  9    5.0  6  a
3  d    5.0  4    7.0  9  b
4  e    5.0  2    1.0  2  b
5  f    4.0  3    NaN  4  b

Вернет

0     True
1    False
2    False
3    False
4    False
5    False
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...