Сообщите значения столбца, соответствующие первым ненулевым и последним нулевым значениям из другого столбца - PullRequest
0 голосов
/ 18 апреля 2019

У меня есть датафрейм, как показано ниже.Я хотел бы просмотреть столбец «Krg» и найти строку, соответствующую последнему нулевому значению в этом столбце, и сообщить «Sg» из этой строки (0,03).Кроме того, я хотел бы сообщить 'Sg', соответствующее 1-му ненулевому значению 'Krg' (0,04).

Я мог бы добиться этого с помощью query () - см. Мой код ниже.

import pandas as pd

col_labels = ['Sg', 'Krg', 'Krw', 'Pc']

df = pd.DataFrame(columns=col_labels)

f = open('EPS.INC', 'r')
for line in f:
    if 'SGWFN' in line:
        print('Reading relative permeability table')
        for line in f:
            line = line.strip()
            if (line.split() and not line.startswith('/') and not line.startswith('--')):
                cols = line.split()
                df=df.append(pd.Series(([float(i) for i in cols]), index=col_labels), ignore_index=True)



print(df.loc[df.query('Krg != 0')['Krg'].idxmin(), 'Sg'])
print(df.loc[(df.query('Krg != 0')['Krg'].idxmin())-1, 'Sg'])
      Sg       Krg       Krw         Pc
0   0.00  0.000000  1.000000   0.000000
1   0.03  0.000000  0.500000   0.091233
2   0.04  0.000518  0.484212   0.093203
3   0.05  0.001624  0.468759   0.095237
4   0.06  0.003171  0.453639   0.097338
5   0.07  0.005098  0.438848   0.099508
6   0.08  0.007367  0.424382   0.101751
7   0.09  0.009953  0.410237   0.104070
8   0.10  0.012835  0.396410   0.106469
9   0.11  0.015999  0.382897   0.108950
10  0.12  0.019431  0.369695   0.111518

Код не выглядит слишком «пагубным» и кажется медленным.Есть ли более разумный способ получить эти значения Sg?

Cheers, D

Ответы [ 3 ]

0 голосов
/ 18 апреля 2019

Мы можем упростить это, используя Series.eq и Series.ne, которые обозначают equal и not equal. Мы объединяем DataFrame.head и DataFrame.tail, чтобы получить первый и последний ряд.


m = df['Krg'].ne(0)
n = df['Krg'].eq(0)

df.loc[m, 'Sg'].head(1).iloc[0]
df.loc[n, 'Sg'].tail(1).iloc[0]

выход

0.04
0.03
0 голосов
/ 18 апреля 2019

Я просто использую idxmax и пытаюсь ускорить ваш оригинальный пост

s=df.query('Krg != 0')['Krg'].idxmin()# here you only need run idxmax once not twice 
print(df.loc[s, 'Sg'])
print(df.loc[s-1, 'Sg'])
0 голосов
/ 18 апреля 2019

Для вашей первой ситуации мы удостоверимся, что «Krg» равно 0, а значение после 0 в столбце «Krg» не равно 0.

df.loc[(df['Krg'] == 0.00000)&(df['Krg'] != df['Krg'].shift(-1)), 'Sg']

Для второй ситуации мы используем мыслительный процесс, аналогичный приведенному выше, но убедитесь, что в строке выше вместо 0 и что они оба не равны 0.

df.loc[(df['Krg'].shift(1) == 0.00000)&(df['Krg'] != df['Krg'].shift(1)), 'Sg']

Используя %% timeit, моя версия примерно на 35% быстрее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...