我正在尝试将符合for
循环中某个条件的行返回到新的数据帧中。所以简而言之,我想在新的df中看到第4行(循环结果)。另外,没有重复的行。因此,如果3到5为True,则每行应返回一次。
np.random.seed(0)
N = 5
df = pd.DataFrame(
{'X':np.random.uniform(-5,5,N),
'Y':np.random.uniform(-5,5,N),
'Z':np.random.uniform(-5,5,N),
})
df
for i in range(len(df)):
for k in range( i+1, len(df)+1 ):
df_sum = df[i:k].sum()
print( "rows", i, "to", k, (df_sum>-5).all() & (df_sum.sum()<1 ))
我想归还这个;
答案 0 :(得分:1)
试试这个..
df_result = df[0:0] # new 1
for i in range(len(df)):
for k in range( i+1, len(df)+1 ):
df_sum = df[i:k].sum()
print( "rows", i, "to", k, (df_sum>-5).all() & (df_sum.sum()<1 ))
if ((df_sum>-5).all() & (df_sum.sum()<1 )): # new 2
df_result = df_result.append(df[i:k]) # new 3
df_result.drop_duplicates() # new 4
第一个新行创建一个空的DataFrame,但保留原始的列结构。如果符合条件,则第二行和第三行将行附加到结果DataFrame。最后一个新行删除了重复项。
另外,请注意,此解决方案不是最高性能的解决方案,因为将行附加到DataFrame效率很低。如果性能成为问题,您可能希望将df_result转换为字典并在最后将其转换为DataFrame。
答案 1 :(得分:1)
另一个解决方案是创建助手df
,然后使用isin
:
df = pd.DataFrame(
{'X':np.random.uniform(-5,5,N),
'Y':np.random.uniform(-5,5,N),
'Z':np.random.uniform(-5,5,N),
})
print (df)
arr = []
for i in range(len(df)):
for k in range( i+1, len(df)+1 ):
df_sum = df[i:k].sum()
val = (df_sum>-5).all() & (df_sum.sum()<1 )
print( "rows", i, "to", k, val)
arr.append([i,val])
#print (arr)
df1 = pd.DataFrame(arr, columns=['ROWS','MASK']).set_index('ROWS')
idx = df1[df1.MASK].index
print (idx)
Int64Index([4], dtype='int64', name='ROWS')
print (df[df.index.isin(idx)])
X Y Z
4 -0.763452 -1.165585 -4.289639
所有这些都与多个DataFrames
:
np.random.seed(0)
N = 5
df1 = pd.DataFrame(
{'X':np.random.uniform(-5,5,N),
'Y':np.random.uniform(-5,5,N),
'Z':np.random.uniform(-5,5,N),
})
N = 6
df2 = pd.DataFrame(
{'X':np.random.uniform(-5,5,N),
'Y':np.random.uniform(-5,5,N),
'Z':np.random.uniform(-5,5,N),
})
N = 7
df3 = pd.DataFrame(
{'X':np.random.uniform(-5,5,N),
'Y':np.random.uniform(-5,5,N),
'Z':np.random.uniform(-5,5,N),
})
L = [df1, df2, df3]
print (L)
dfs = {}
for j, df in enumerate(L):
arr = []
for i in range(len(df)):
for k in range( i+1, len(df)+1 ):
df_sum = df[i:k].sum()
val = (df_sum>-5).all() & (df_sum.sum()<1 )
#print( "rows", i, "to", k, val)
arr.append([i,val])
df1 = pd.DataFrame(arr, columns=['ROWS','MASK']).set_index('ROWS')
idx = df1[df1.MASK].index
#print (df[df.index.isin(idx)])
dfs['df' + str(j + 1)] = df[df.index.isin(idx)]
print (dfs)
{'df1': X Y Z
4 -0.763452 -1.165585 -4.289639, 'df2': X Y Z
0 -4.128707 2.991586 4.446689
1 -4.797816 -0.385206 0.218483
3 2.781568 -3.817256 -2.354444
5 4.786183 -3.566467 -0.438497, 'df3': X Y Z
0 0.684339 -1.404921 -3.710737
1 -4.812102 -0.629680 -1.845716
2 1.176355 1.976312 -1.362892
3 1.120957 -4.397745 0.701968
6 1.818203 -2.896174 -3.979552}
print (dfs['df1'])
X Y Z
4 -0.763452 -1.165585 -4.289639