【问题标题】:delete a part of pd.DataFrame with Python用 Python 删除 pd.DataFrame 的一部分
【发布时间】:2016-07-17 04:31:48
【问题描述】:

我正在使用 DataFrame.iterrows() 遍历我的 DataFrame 中的行,如果一行满足某些条件,我将其存储在另一个 DataFrame 中。有没有办法像 set.difference(another_set) 一样删除同时出现的行?

我被要求提供代码,因此,由于我不知道我的问题的答案,我解决了我的问题并创建了另一个 DataFrame,我保存了良好的数据而不是拥有两个 DataFrame 并对其进行区分两者都有。

def test_right_chain(self, temp):
    temp__=pd.DataFrame()
    temp_=pd.DataFrame()
    key=temp["nr right"].iloc[0]
    temp_=temp_.append(temp.iloc[0])
    temp=temp[1:]
    for index, row in temp.iterrows():
        print row
        key_=row['nr right']
        if abs(key_-key)==1:
            pass
        elif len(temp_)>2:
            print row
            temp__.append(temp_)
            temp_=pd.DataFrame()
        else:
            temp_=pd.DataFrame()
        temp_=temp_.append(row)
        key=key_
    return temp__

【问题讨论】:

  • 您应该至少发布一些输入代码和预期输出,以便我们重现您的问题并为您提供帮助。
  • 如果您能以 text 形式提供一个包含 5-7 行的示例输入数据集并提供预期输出,这将更容易为您提供帮助

标签: python pandas dataframe


【解决方案1】:

您可以将两个 DataFrame 与 df.merge(df1, df2, right_index=True, how='inner') 函数相交,留下由左侧 DataFrame 中的行显示的索引(我不知道为什么,但是当我使用 right_index=True 时会发生这种情况),然后检索那些行。 (我使用了这个问题的答案:Compare Python Pandas DataFrames for matching rows

df1 = pd.DataFrame(np.random.rand(10,4),columns=list('ABCD'))

df2 = df1.ix[4:8]
df2.reset_index(drop=True,inplace=True)
df2.loc[-1] = [2, 3, 4, 5]
df2.loc[-2] = [14, 15, 16, 17]
df2.reset_index(drop=True,inplace=True)

df3=pd.merge(df1, df2, on=['A', 'B', 'C', 'D'], right_index=True, how='inner')

现在您需要出现在两个 DataFrame 中的行的索引:

indexes= df3.index.values

然后您只需从 DataFrame 中删除这些行:

df1=df1.drop(df1.index[indexes])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-08
    • 2021-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-22
    相关资源
    最近更新 更多