我正在寻找可以帮助我解决以下问题的 Python 脚本:
有以下两列,我需要在序列之间创建间隙以使它们match:
输入 | 输出 | |||
---|---|---|---|---|
索引 | A 列 | B列 | A 列 | B列 |
0 | 1 | 1 | 1 | 1 |
1 | 2 | 2 | 2 | 2 |
2 | 2 | 2 | 2 | 2 |
3 | 3 | 3 | 3 | 3 |
4 | 4 | 3 | 3 | |
5 | 5 | 4 | 4 | 4 |
6 | 5 | 5 | 5 | 5 |
7 | 6 | 5 | 5 | 5 |
8 | 8 | 6 | 6 | 6 |
9 | 8 | 8 | 8 | 8 |
10 | 9 | 8 | 8 | 8 |
11 | 10 | 9 | 9 | 9 |
12 | 11 | 9 | 9 | |
13 | 11 | 10 | 10 | 10 |
14 | 15 | 13 | 11 | |
15 | 16 | 13 | 11 | |
16 | 16 | 14 | 13 | |
17 | 17 | 14 | 13 | |
18 | 17 | 15 | 14 | |
19 | 18 | 15 | 14 | |
20 | 19 | 16 | 15 | 15 |
21 | 21 | 16 | 15 | |
22 | 22 | 17 | 16 | 16 |
23 | 27 | 17 | 16 | 16 |
24 | 17 | 17 | ||
25 | 17 | 17 | ||
26 | 18 | |||
27 | 19 | |||
28 | 21 | |||
29 | 22 | |||
30 | 27 |
我尝试过使用 Pandas 和 Python 做不同的事情,首先我尝试将列转换为列表并逐个迭代但没有用,我最接近的方法是这个,但不幸的是仍然没有用:
for i in df.index:
if(df['column A'][i] != df['column B'][i]):
df['column A'] = df['column A'][:i] + np.NaN + df['column A'][i:]
#df['column A'][i] = df['column A'].append(pd.Series([np.NaN]))
#df2['column A'] = df['column A'].loc[i] = np.NaN
在遍历对象时更改对象通常是个坏主意。相反,只需将两个新列表初始化为空,并根据需要用原始列或 NaN 中的值填充它们。诀窍是分别迭代列 A 和 B 的索引,这样当您在另一个列表中填充 NaN 值时,您可以只增加其中一个:
a = df['column A'].values
b = df['column B'].values
a_out = []
b_out = []
i = 0
j = 0
while i < len(df) and j < len(df):
if a[i] == b[j]:
a_out.append(a[i])
i += 1
b_out.append(b[j])
j += 1
elif a[i] < b[j]:
a_out.append(a[i])
i += 1
b_out.append(np.nan)
else:
a_out.append(np.nan)
b_out.append(b[j])
j += 1
if i < j:
a_out.extend(a[i:])
b_out.extend([np.nan] * len(a[i:]))
elif i > j:
b_out.extend(b[j:])
a_out.extend([np.nan] * len(b[j:]))
df_out = pd.DataFrame({'column A': a_out,
'column B': b_out})