【问题标题】:Processing my dataframes with conditions - python jupyter notebook使用条件处理我的数据帧 - python jupyter notebook
【发布时间】:2020-01-06 13:06:13
【问题描述】:

这是我的第一篇文章,我不太喜欢编程和 python。希望我能很好地描述这一点,请耐心等待:)

对于我的学习,我使用 jupyter notebook(numpy pandas 等)来处理和绘制我的数据。 在这里,它与 X 射线束和 Geiger-Müller 计数器有关。 它看起来像这样:

# loading my txt
data1_1_KBr = pd.read_csv("1_1_SpektrumCuKBr_Daten.txt",skiprows=2,usecols=[0,1], 
                           names=["Winkel1_1_KBr","Rate1_1_KBr"],delimiter="\t",decimal=",")
#putting into dataframe
df1_1_KBr = pd.DataFrame(data1_1_KBr,columns=["Winkel1_1_KBr","Rate1_1_KBr"])

#this is the correction of my values
N_1_1_KBr = (df1_1_KBr.Rate1_1_KBr/(1-T*df1_1_KBr.Rate1_1_KBr))

更正仅适用于“Rate1_1_KBr”的较高值。

处理后的数据应该是熊猫数据框或类似数组的数据,看起来与我的原始数据相同,但条目已更正。

我尝试写循环,但失败了。

应该是这样的(没有代码只是想法):

如果“Rate1_1_KBr”的值小于 200,则将它们放入我的新数据框中,如果“Rate1_1_KBr”的值大于 200,则使用我的更正处理它们,然后将它们放入我的新数据框中。

如果有人对像我这样的初学者有一个很好的解释,那就太棒了:)

【问题讨论】:

标签: python pandas dataframe jupyter-notebook physics


【解决方案1】:

我不确定您是否熟悉 numpy,但您可以以相同的方式对数据帧使用索引。此外,您的代码的第二行是多余的,因为 pd.read_csv 本身返回一个数据帧。所以你想要的代码是这样的:

df1_1_KBr = pd.read_csv("1_1_SpektrumCuKBr_Daten.txt",skiprows=2,usecols=[0,1], 
                           names=["Winkel1_1_KBr","Rate1_1_KBr"],delimiter="\t",decimal=",")
correction_df = df1_1_KBr[df1_1_KBr.Rate1_1_KBr>200]
N_1_1_KBr = df1_1_KBr.copy()
N_1_1_KBr[correction_df.index, 'Rate1_1_KBr'] = (correction_df.Rate1_1_KBr/(1-T*correction_df.Rate1_1_KBr))

请注意,无需使用apply,因为它比这种方式索引要慢得多。

也不确定T 是常量值还是数据帧的一部分。如果是前者,这段代码应该可以工作。

【讨论】:

  • 感谢回答 :) “T”是一个常数。它不起作用:TypeError:不可散列的类型:'Int64Index'。有一个缺失或错位的“'”。我都试过了,但都不行。
  • @DennisS.你能提供一个 csv 文件的虚拟版本吗?或者只是通过手动添加数据框来更新问题。另外,哪一行会抛出错误?
【解决方案2】:

欢迎丹尼斯,

def proc_rate(rate, threshold, T):
    if rate<threshold:
        return rate
    else:
        return (rate/(1-T*rate))

ans = df1_1_KBr.Rate1_1_KBr.apply(proc_rate, threshold=200, T=T)

如果您想将系列写回原始数据框:

df1_1_KBr.loc[:, 'Rate1_1_KBr'] = df1_1_KBr.Rate1_1_KBr.apply(proc_rate, threshold=200, T=T)

您还可以过滤费率,然后应用校正方法:

sub_frame = df1_1_KBr.Rate1_1_KBr[df1_1_KBr.Rate1_1_KBr<200].apply(proc_rate, threshold=200, T=T)

【讨论】:

    猜你喜欢
    • 2021-04-26
    • 1970-01-01
    • 2023-03-10
    • 2018-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多