我有一个像这样的pandas数据框:
我想迭代第3列,如果存在元素,则在数据帧中添加一个新行,使用第3列中的值作为第2列中的新值,同时还使用第0列和第1列中的数据在新添加的行中找到它作为第0列和第1列的值的行:
这里,第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.
答案 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))