第一次在这里发帖,对Python很新,并且在pandas专栏中重写值有些困难。我有一个包含一些列的数据框(其中包括'Ba Avg','Study','Latitude','Upper Depth'等)。我试图平均一些值并将它们写入一个名为“Upper Avg”的新列。
在开始时,我创建了一个名为“Upper Avg”的新列,并将df的索引保存为列表。
接下来,对于来自'Study'1020的数据帧的行,我使他们的'Upper Avg'与他们的'Ba Avg'相同。这虽然可能效率不高,但完全没问题。
接下来我想处理研究191,但我希望他们的'上平均'是研究中每个'Ba Avg'的平均值,它位于同一位置('纬度')并且值为a, b,或c在他们的'ConstraintCol'中。为此,我制作了一组纬度值,然后循环遍历值,分别查找具有该纬度的值(在多个研究中不重复纬度),使用这些值创建新的df。然后我制作一个满足称为“范围”约束的df。我将范围索引保存到列表中,然后执行我想要的平均值,将值保存为'avg'。
这里的问题是当我尝试将此值avg放入df时。我尝试过使用loc并使用replace,每次更换时都会在以后查看df时保存值。
对于冗长的帖子感到抱歉,但感谢任何指导!
df['Upper Avg'] = ""
index = df.index.tolist()
for i in index:
if df['Study'][i] == 1020:
df['Upper Avg'][i] = df['Ba Avg'][i]
lats = set(df[df['Study'] == 191]['Latitude'])
for i in lats:
latset = df[df['Latitude'] == i]
constraint = [a,b,c]
ranges = latset[latset['ConstraintCol'].isin(constraint)]
idx = ranges.index.tolist()
avg = ranges['Ba Avg'].sum() / 3
df.loc[idx]['Upper Avg'] = avg
答案 0 :(得分:1)
从这开始。这是np.where outcome = np.where(condition,true,false)
#df['Upper Avg'] = ""
#index = df.index.tolist()
# for i in index:
# if df['Study'][i] == 1020:
# df['Upper Avg'][i] = df['Ba Avg'][i]
df['Upper Avg'] = np.where(df['Study'] == 1020, df['Ba Avg'], np.nan)
lats = set(df[df['Study'] == 191]['Latitude'])
for i in lats:
latset = df[df['Latitude'] == i]
constraint = [a,b,c]
ranges = latset[latset['ConstraintCol'].isin(constraint)]
idx = ranges.index.tolist()
avg = ranges['Ba Avg'].sum() / 3
df.loc[idx]['Upper Avg'] = avg
答案 1 :(得分:1)
当您使用.loc,.ix和.iloc时,如果您使用语法,则可能(正确地)获得有关在副本上设置值的警告:
df.loc[index]["column"]
正确执行此操作的方法如下:
df.loc[index, "column"]
注意区别。如果您创建一个已经是视图的视图,它往往与原始数据框分开,因此您对此视图视图所做的任何编辑都不会保留。
您正在做的事情称为链式索引,通常不起作用。见下面的链接。理解这一点的最简单方法是,如果您正在调用一个在数据框上运行的(.loc,.ix,.iloc),那么您的更改将在数据框的原始副本上,并且将是永久性的。如果您正在执行多个操作,例如df [col] [index],那么您很可能正在编辑副本(而不是原始数据帧)。
http://pandas.pydata.org/pandas-docs/stable/indexing.html#returning-a-view-versus-a-copy