我试图交错(不规则地)两个数据帧(每个包含两列 x1 和 x2),这取决于每个数据帧中 x1-x1 和 x2-x2 之间的条件关系。使用单个 for 循环和每个数据帧的计数器,我想将 x1/x2 对增量添加到最终列表/数据帧中,具体取决于条件(4x if-and 条件)。df_out 是一个不规则拼接的单个数据帧,包含两列 x1/x2,以及所有 x1/x2 对。也许for循环中的双计数器有问题?(我的实际 df 包含 30 多列和 1000 行...给出的示例 df)
toolz interleave 不起作用,因为拼接不规则。if-conditional 中的 if-conditional 缩进不起作用,迭代在某些时候失败,但不知道为什么。
dfDown 输入数据帧 1 dfDown 输入数据帧1
dfUp 输入数据帧 2 dfUp 输入数据帧2
df_desired_out 是所需的输出 df df_desired_out 是所需的输出 df
import pandas as pd
import numpy as np
dataDown = {'x1':(0,0,0,0,0,0,0), 'x2':(2,10,20,25,33,47,57)}
dataUp = {'x1':(2,2,2,2,2,2), 'x2':(7,13,24,30,36,39)}
dfDown = pd.DataFrame(dataDown)
dfUp = pd.DataFrame(dataUp)
totalUpDown = len(dfUp) + len(dfDown) # total number of x1/x2 pairs
countUpDown = np.arange(totalUpDown) # to be used in for loop
allUpDown = [] # empty list
countUp = 0 # up data counter to be used in for loop
countDown = 0 # down data counter to be used in for loop
for count in countUpDown: # single for loop containing 4 exclusive conditionals, and two 'counters'
# this conditional should write a dfDown x1/x2 pair into list allUpDown, and increment down-counter by 1
if dfDown['x1'][countDown] < dfUp['x1'][countUp] and dfDown['x2'][countDown] < dfUp['x2'][countUp]:
combi = pd.DataFrame([[[dfDown['x1'][countDown]], dfDown['x2'][countDown]]],
columns = ['x1', 'x2'])
allUpDown.append(combi)
countDown +=1
# this conditional should write a dfUp x1/x2 pair into list allUpDown, and increment up-counter by 1
if dfDown['x1'][countDown] < dfUp['x1'][countUp] and dfDown['x2'][countDown] > dfUp['x2'][countUp]:
combi = pd.DataFrame([[[dfUp['x1'][countUp]], dfUp['x2'][countUp]]],
columns = ['x1', 'x2'])
allUpDown.append(combi)
countUp +=1
# this conditional should write a dfDown x1/x2 pair into list allUpDown, and increment down-counter by 1
if dfDown['x1'][countDown] > dfUp['x1'][countUp] and dfDown['x2'][countDown] < dfUp['x2'][countUp]:
combi = pd.DataFrame([[[dfDown['x1'][countDown]], dfDown['x2'][countDown]]],
columns = ['x1', 'x2'])
allUpDown.append(combi)
countDown +=1
# this conditional should write a dfUp x1/x2 pair into list allUpDown, and increment up-counter by 1
if dfDown['x1'][countDown] > dfUp['x1'][countUp] and dfDown['x2'][countDown] > dfUp['x2'][countUp]:
combi = pd.DataFrame([[[dfUp['x1'][countUp]], dfUp['x2'][countUp]]],
columns = ['x1', 'x2'])
allUpDown.append(combi)
countUp +=1
# Build the interleaved dataframe from the list of all x1/x2 pairs
df_out = pd.concat(allUpDown, ignore_index = True)
df_out
df_out 应该类似于此处显示的 df_desired_out:
desired_out = {'x1':(0,2,0,2,0,2,0,2,0,2,2,0,0), 'x2':(2,7,10,13,20,24,25,30,33,36,39,47,57)}
df_desired_out = pd.DataFrame(desired_out)
df_desired_out