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

时间:2015-10-01 16:24:35

标签: python pandas

我有一个像这样的pandas数据框:

enter image description here

我想迭代第3列,如果存在元素,则在数据帧中添加一个新行,使用第3列中的值作为第2列中的新值,同时还使用第0列和第1列中的数据在新添加的行中找到它作为第0列和第1列的值的行:

enter image description here

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

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

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.

2 个答案:

答案 0 :(得分:1)

您可以通过创建包含所需列的新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留下新的缺失值,您可以更改这些值,然后更改为无。

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

答案 1 :(得分:0)

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

import pandas as pd

def append_rows(scan_row,scanned_dataframe):
    new_df = pd.DataFrame()
    for i,row in scanned_dataframe.iterrows():
        if row[scan_row]:
            new_row = [row[i] for i in range(scan_row -1)]
            new_row.append(row[scan_row])
            print new_row
            new_df = new_df.append([new_row],ignore_index=True)
    return new_df

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

b = b.append(append_rows(3,a))