Python 如果列值存在,则创建新行

Python 如果列值存在,则创建新行,python,pandas,Python,Pandas,我有一个熊猫数据框,看起来像这样: 我想遍历第3列,如果存在元素,则向dataframe添加一个新行,使用第3列中的值作为第2列中的新值,同时也使用第0列和第1列中的数据作为新添加行中第0列和第1列的值: 这里,第2行是新添加的行。此行第0列和第1列中的值来自找到“D”的行,现在新行的第2列包含第一行“D”第3列中的值 这里有一种方法,但肯定有一个更通用的解决方案,特别是如果我希望扫描多个列: a = pd.DataFrame([['A','B','C','D'],[1,2,'C']]) b

我有一个熊猫数据框,看起来像这样:

我想遍历第3列,如果存在元素,则向dataframe添加一个新行,使用第3列中的值作为第2列中的新值,同时也使用第0列和第1列中的数据作为新添加行中第0列和第1列的值:

这里,第2行是新添加的行。此行第0列和第1列中的值来自找到“D”的行,现在新行的第2列包含第一行“D”第3列中的值

这里有一种方法,但肯定有一个更通用的解决方案,特别是如果我希望扫描多个列:

a = pd.DataFrame([['A','B','C','D'],[1,2,'C']])
b = a.copy()
for tu in a.itertuples(index=False):         # Iterate by row
    if tu[3]:                                # If exists
        b = b.append([[tu[0],tu[1],tu[3]]], ignore_index=True)  # Append with new row using correct tuple elements.

这可能更一般(假设您的列是整数,并且您总是希望填充此模式中的前几列)


通过创建一个包含所需列的新df并将其附加到原始df,您可以在不使用任何循环的情况下完成此操作

import pandas as pd
import numpy as np

df = pd.DataFrame([['A','B','C','D'],[1,2,'C']])

ndf = df[pd.notnull(df[3])][[0,1,3]]
ndf.columns = [0,1,2]
df = df.append(ndf, ignore_index=True)
这将为新缺少的值留下NaN,您可以更改这些值,然后更改为None

df[3] = df[3].where((pd.notnull(df[3])), None)
印刷品

   0  1  2     3
0  A  B  C     D
1  1  2  C  None
2  A  B  D  None

因为我的真实df使用字符串作为列名,所以在使用
append
时,我遇到了列重新排序的问题。为了解决这个问题,我将原始列名记录为
df\u cols
,然后在附加的数据帧上使用
df=df.reindex\u axis(df\u cols,axis=1)
   0  1  2     3
0  A  B  C     D
1  1  2  C  None
2  A  B  D  None