首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从另一列报告对应于第1非零值和最后0值的列值。

问从另一列报告对应于第1非零值和最后0值的列值。
EN

Stack Overflow用户
提问于 2019-04-17 23:19:21
回答 3查看 62关注 0票数 0

我有一个数据,如下所示。我希望扫描'Krg‘列,并找到与该列中最后一个零值相对应的行,并从该行(0.03)中报告'Sg’。此外,我想报告“Sg”对应于'Krg‘(0.04)的第一个非零值。

我可以使用query()实现这一点--参见下面的代码。

代码语言:javascript
复制
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'])
代码语言:javascript
复制
      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”值?

干杯,D

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-04-18 00:01:21

我们可以通过使用Series.eq和Series.ne来简化这一点,它们代表着equal和not equal。我们将DataFrame.head和DataFrame.tail结合起来,得到他的第一行和最后一行。

代码语言:javascript
复制
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]

输出

代码语言:javascript
复制
0.04
0.03
票数 0
EN

Stack Overflow用户

发布于 2019-04-17 23:58:57

对于第一种情况,我们确保'Krg‘是0,并且'Krg’列中0后面的值不是0。

代码语言:javascript
复制
df.loc[(df['Krg'] == 0.00000)&(df['Krg'] != df['Krg'].shift(-1)), 'Sg']

对于第二种情况,我们使用类似于上面的思考过程,但是确保上面的行是0,并且它们都不是0。

代码语言:javascript
复制
df.loc[(df['Krg'].shift(1) == 0.00000)&(df['Krg'] != df['Krg'].shift(1)), 'Sg']

使用%%timeit,我的版本大约快35%。

票数 0
EN

Stack Overflow用户

发布于 2019-04-18 00:16:41

我只是使用idxmax,试着加快你原来的发帖速度。

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55737227

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档