我希望根据特定条件在两个现有行之间的数据框中插入一行。
例如,我的数据框:
import pandas as pd
df = pd.DataFrame({'Col1':['A','B','D','E'],'Col2':['B', 'C', 'E', 'F'], 'Col3':['1', '1', '1', '1']})
看起来像:
Col1 Col2 Col3
0 A B 1
1 B C 1
2 D E 1
3 E F 1
我希望能够在索引1和索引2之间插入一个新行,条件为:
n = 0
while n < len(df):
(df.ix[n]['Col2'] == df.ix[n+1]['Col1']) == False
Something, Something, insert row
n+=1
我想要的输出表如下:
Col1 Col2 Col3
0 A B 1
1 B C 1
2 C D 1
3 D E 1
4 E F 1
我正在努力根据前一个和前一个记录中的值条件插入行。我最终希望在我的真实世界示例中执行上述练习,其中包括多个条件,并保留多个列的值(在此示例中它是Col3,但在我的真实世界中它将是多列)
答案 0 :(得分:1)
UPDATE:内存保存方法 - 首先为新行设置一个带有间隙的新索引:
In [30]: df
Out[30]:
Col1 Col2 Col3
0 A B 1
1 B C 1
2 D E 1
3 E F 1
如果我们想在索引1
和2
之间插入新行,我们会将索引拆分为2
位置:
In [31]: idxs = np.split(df.index, 2)
设置新索引(位置2
处的间隙):
In [32]: df.set_index(idxs[0].union(idxs[1] + 1), inplace=True)
In [33]: df
Out[33]:
Col1 Col2 Col3
0 A B 1
1 B C 1
3 D E 1
4 E F 1
插入索引为2
的新行:
In [34]: df.loc[2] = ['X','X',2]
In [35]: df
Out[35]:
Col1 Col2 Col3
0 A B 1
1 B C 1
3 D E 1
4 E F 1
2 X X 2
排序索引:
In [38]: df.sort_index(inplace=True)
In [39]: df
Out[39]:
Col1 Col2 Col3
0 A B 1
1 B C 1
2 X X 2
3 D E 1
4 E F 1
PS你也可以使用df.append(new_df)
插入DataFrame而不是单行:
In [42]: df
Out[42]:
Col1 Col2 Col3
0 A B 1
1 B C 1
2 D E 1
3 E F 1
In [43]: idxs = np.split(df.index, 2)
In [45]: new_df = pd.DataFrame([['X', 'X', 10], ['Y','Y',11]], columns=df.columns)
In [49]: new_df.index += idxs[1].min()
In [51]: new_df
Out[51]:
Col1 Col2 Col3
2 X X 10
3 Y Y 11
In [52]: df = df.set_index(idxs[0].union(idxs[1]+len(new_df)))
In [53]: df
Out[53]:
Col1 Col2 Col3
0 A B 1
1 B C 1
4 D E 1
5 E F 1
In [54]: df = df.append(new_df)
In [55]: df
Out[55]:
Col1 Col2 Col3
0 A B 1
1 B C 1
4 D E 1
5 E F 1
2 X X 10
3 Y Y 11
In [56]: df.sort_index(inplace=True)
In [57]: df
Out[57]:
Col1 Col2 Col3
0 A B 1
1 B C 1
2 X X 10
3 Y Y 11
4 D E 1
5 E F 1
OLD回答:
实现这一目标的方法之一是拆分DF并将其与所需的DF连接在一起:
原创DF:
In [12]: df
Out[12]:
Col1 Col2 Col3
0 A B 1
1 B C 1
2 D E 1
3 E F 1
让我们把它分成两部分([0:1],[2:结束]):
In [13]: dfs = np.split(df, [2])
In [14]: dfs
Out[14]:
[ Col1 Col2 Col3
0 A B 1
1 B C 1, Col1 Col2 Col3
2 D E 1
3 E F 1]
现在我们可以将它与所需顺序的新DF连接在一起:
In [15]: pd.concat([dfs[0], pd.DataFrame([['C','D', 1]], columns=df.columns), dfs[1]], ignore_index=True)
Out[15]:
Col1 Col2 Col3
0 A B 1
1 B C 1
2 C D 1
3 D E 1
4 E F 1