【问题标题】:using an if statement over two columns in pandas在 pandas 的两列上使用 if 语句
【发布时间】:2017-08-31 07:18:02
【问题描述】:

我目前正在尝试计算具有多条线的地震导航文件中的炮点之间的距离。我目前的代码如下:

def Delimiter(Filename, a, b, c, d, e, f):
    data = pd.read_fwf(Filename, names=[a, b ,c ,d ,e ,f ], header=None)
    data['lineshift'] = data['line'].shift(-1)
    data['bool'] = data['lineshift'] == data['line']
    for _, row in data.iterrows():
        data['SPDIF'] = np.abs(data['sp'].astype(float) - data['sp'].astype(float).shift(-1))
        data['XDIFF'] = data['X'] - data['X'].shift(-1)
        data['YDIFF'] = data['Y'] - data['Y'].shift(-1)
        data['XYDIFF'] = np.sqrt(data['XDIFF']**2 + data['YDIFF']**2)
        data['SPDIST'] = data['XYDIFF']/data['SPDIF']
        if row['line'] != row['lineshift']:

            data['SPDIF'] = data['SPDIF'].replace({0: np.nan})
            data['XDIFF'] = data['XDIFF'].replace({0: np.nan})
            data['YDIFF'] = data['YDIFF'].replace({0: np.nan})
            data['XYDIFF'] = data['XYDIFF'].replace({0: np.nan})
            data['SPDIST'] = data['SPDIST'].replace({0: np.nan})
    data.info()
    print data

Delimiter(os.path.splitext(x)[0] + ".csv", "line", "sp", "Xcoord", "Ycoord", "X", "Y")

此代码将包含射击点数据的 CSV 加载到 pandas 数据框中。但是,我想检查代码是否没有计算不同线的 2 个射击点之间的距离。如果“line”列与同一行的“lineshift”列不同,我希望它显示 N/A。如果相同,则应为该特定行计算 5 个新列。

但是当我运行这段代码时,它给出了以下错误:

ValueError:Series 的真值不明确。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()。

如果可能,我需要添加什么来使这段代码运行并检查每一行?

CSV 文件中的数据示例:

      line    sp    ycoord     xcoord    x       y          lineshift
8     761298  1080  521754.1N  65132.6E  255355  479838     761298   True
9     761298  1090  5218 2.5N  65154.3E  255760  480107     761298   True
10    761298  1100  521812.1N  65216.0E  256165  480410     761298   True
11    761298  1110  521820.7N  65236.8E  256554  480685     771022  False
12    771022  1020  521835.8N  65238.3E  256573  481153     771022   True
13    771022  1030  521841.0N  65245.2E  256700  481315     771022   True
14    771022  1040  521845.8N  65252.2E  256830  481466     771022   True

【问题讨论】:

    标签: python python-2.7 pandas if-statement dataframe


    【解决方案1】:

    这:data['lineshift'] == data['line'] 是一个系列,而不是布尔值,所以 if data['lineshift'] == data['line'] 是模棱两可的。

    我认为您的意思是测试循环中的当前行,例如:

        for _, row in data.iterrows():
            if row['lineshift'] == row['line']:
                # ...
    

    编辑:这修复了您报告的错误,但您不应在此处使用循环。

    def Delimiter(Filename, a, b, c, d, e, f):
        data = pd.read_fwf(Filename, names=[a, b ,c ,d ,e ,f ], header=None)
        data['lineshift'] = data['line'].shift(-1)
        data['bool'] = data['lineshift'] == data['line']
        # calculate this only once
        data['SPDIF'] = np.abs(data['sp'].astype(float) - data['sp'].astype(float).shift(-1))
        data['XDIFF'] = data['X'] - data['X'].shift(-1)
        data['YDIFF'] = data['Y'] - data['Y'].shift(-1)
        data['XYDIFF'] = np.sqrt(data['XDIFF']**2 + data['YDIFF']**2)
        data['SPDIST'] = data['XYDIFF'] / data['SPDIF']
    
        data.loc[~data['bool'], ['SPDIF', 'XDIFF', 'YDIFF', 'XYDIFF', 'SPDIST']] = np.nan
    
        data.info()
        print data
    

    【讨论】:

    • 使用 if row['lineshift'] == row['line']: 给我以下错误:TypeError: tuple indices must be integers, not str
    • 请注意,这将修复您报告的错误。 if/else 语句中的代码仍然需要一些工作。
    • 是的,它现在似乎可以运行了,但是行不匹配的值都没有被替换。你知道如何将多列的行值设置为 0 或 n/a 吗?我在帖子中编辑了我当前的代码
    • 奇怪,它仍然显示应该用 n/a 替换的行的值。
    • 我怀疑您没有任何以0 开头的值,因此它们不会被NaN 替换。会是这样吗?
    猜你喜欢
    • 2020-03-03
    • 2020-10-14
    • 2021-06-05
    • 2020-07-09
    • 1970-01-01
    • 1970-01-01
    • 2018-09-26
    • 2021-09-15
    • 2019-09-05
    相关资源
    最近更新 更多