如何基于熊猫另一列的条件更改数据框元素

时间:2020-06-23 17:43:30

标签: python pandas dataframe

我已经环顾四周(例如here),但是我不明白为什么我的代码无法按预期工作。 我有一个pandas数据框,我想添加一列以标记B列中非零元素上方的最后一个零元素。

df = pd.DataFrame({'B':[0,0,1,0,1,0,0,1]})
N = len(df.index)
df['C'] = N*[False]
for i in range(N-1):
    if (df.iloc[i]['B']==0 and df.iloc[i+1]['B']>0):
        df.iloc[i]['C']=True

尽管条件满足3次,但C列仍然全为假,并且我还得到一条警告,我不明白:

SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

对于具有混合类型的数据框(如此处),似乎熊猫在使用iloc和类似函数时会创建副本。您可以执行以下操作来代替链索引:

df.iloc[i, df.columns.get_loc('C')]=True

df.at[i, 'C'] = True

但是,我建议您用此替换您的for循环,这对我来说似乎更简单:

df['C'] = [df.iloc[i]['B'] == 0 and df.iloc[i+1]['B'] > 0 for i in range(N - 1)] + [False]

编辑:如果您实际上想查找零元素之前最后一次出现的非零元素,请尝试以下操作:

df['C'].where(df['C']).last_valid_index()

这将输出6

答案 1 :(得分:0)

按索引降序排序,然后循环查找第一行。

df=df.sort_index(ascending=False)
df['C'] = False
for i in range(len(df['B'])):
    if df.iloc[i-1,0] - 1 == df.iloc[i,0]:
        df.iloc[i,1] = True
        break
df=df.sort_index(ascending=True)
df

    B   C
0   0   False
1   0   False
2   1   False
3   0   False
4   1   False
5   0   False
6   0   True
7   1   False

答案 2 :(得分:0)

您可以在for循环中更改hour = int(input("Starting time (hours): ")) mins = int(input("Starting time (minutes): ")) dura = int(input("Event duration (minutes): ")) minresult = ((mins + dura) % 60) hourresult = (((mins + dura)//60 + hour) % 24) print("The event will end on", hourresult,":" ,minresult) df.iloc[i]['C']=True使其正常工作。

但是我宁愿使用以下内容使其效率更高:

df.loc[i, 'C'] = True