在python中将循环的结果写入数据帧

在python中将循环的结果写入数据帧,python,python-2.7,Python,Python 2.7,我需要每天检查索引值的列表,为了便于阅读,我将它们放入数据框中。我正在使用Python 2.7 首先,我将答案输出到一个列表中: index_list = [df1,df2,df3,df4,df5,df6,df7] value_list = [20,22,28,29,30,31,32,33] myarray = [] def minimum(dataframe,value): return dataframe['Datetime'][(dataframe["IDXType"] ==

我需要每天检查索引值的列表,为了便于阅读,我将它们放入数据框中。我正在使用Python 2.7

首先,我将答案输出到一个列表中:

index_list = [df1,df2,df3,df4,df5,df6,df7] 
value_list = [20,22,28,29,30,31,32,33]
myarray = []

def minimum(dataframe,value):
    return dataframe['Datetime'][(dataframe["IDXType"] == value)].min()

for i in index_list:
    for value_i in value_list:
        myarray.append(minimum(i,value_i))
这将输出一个56镜头长的列表,然后我手动将其放入数据帧

result = {'df1':pd.Series(myarray[0:8], index=value_list),
  'df2':pd.Series(myarray[8:16], index=value_list),
  'df3':pd.Series(myarray[16:24], index=value_list),
  'df4':pd.Series(myarray[24:32], index=value_list),
  'df5':pd.Series(myarray[32:40], index=value_list),
  'df6':pd.Series(myarray[40:48], index=value_list),
  'df7':pd.Series(myarray[48:56], index=value_list),
  }
result = pd.DataFrame(result)
result
它显示8*7数据帧。如下图所示:

我想问一下这个项目是否有捷径? 比如,直接将循环结果放入数据帧

我的列表不断增加,因此我无法每隔一天修复一次代码。

您可以使用:

df1 = pd.DataFrame({'Datetime':pd.date_range('2015-01-04','2015-01-08'),
                    'IDXType':[20,20,33,33,33]})

print (df1)
    Datetime  IDXType
0 2015-01-04       20
1 2015-01-05       20
2 2015-01-06       33
3 2015-01-07       33
4 2015-01-08       33

df2 = pd.DataFrame({'Datetime':pd.date_range('2015-01-04','2015-01-08'),
                   'IDXType':[30,30,21,21,10]})

print (df2)
    Datetime  IDXType
0 2015-01-04       30
1 2015-01-05       30
2 2015-01-06       21
3 2015-01-07       21
4 2015-01-08       10

df3 = pd.DataFrame({'Datetime':pd.date_range('2015-01-04','2015-01-08'),
                   'IDXType':[20,20,30,31,31]})

print (df3)
    Datetime  IDXType
0 2015-01-04       20
1 2015-01-05       20
2 2015-01-06       30
3 2015-01-07       31
4 2015-01-08       31
我的解决方案包含并聚合
min
,最后删除
索引名
(在
pandas
<0.18.0中新增):


您还可以使用更动态的解决方案-在
concat
中使用
列表理解
,但需要为新
df5
中的列名添加新列表:

index_list = [df1,df2,df3] 
value_list = [20,22,28,29,30,31,32,33]
namesdf = ['df1','df2','df3']   
df5 = pd.concat([x.groupby('IDXType')['Datetime'].min() for x in index_list], 
               axis=1, 
               keys=namesdf).reindex(value_list).rename_axis(None)
print (df5)  
          df1        df2        df3
20 2015-01-04        NaT 2015-01-04
22        NaT        NaT        NaT
28        NaT        NaT        NaT
29        NaT        NaT        NaT
30        NaT 2015-01-04 2015-01-06
31        NaT        NaT 2015-01-07
32        NaT        NaT        NaT
33 2015-01-06        NaT        NaT

index\u list
DataFrames
list
,包含列
Datetime
IDXType
?index是包含列的DataFrames的列表。Datetime和IDXType是我必须在原始源数据框中检查的两列。感谢reindex和concat的想法。我遇到的最大问题是如何直接写入数据帧,而不是转换为现有数据帧(这意味着我必须每天修改数据帧的大小/名称等)。我需要以下方面的帮助:循环->列表->数据帧到循环->数据帧.Hmmm,但为什么需要循环?在熊猫是最好的避免所有的循环。我似乎不明白为什么我的解决方案不好,你能解释一下吗?好吧,我必须从一个数据帧到另一个数据帧(在索引列表中)读取,以找到每个特定列(这里是“IDXType”)中的最小值,当该列等于特定值(在值列表中)…我不知道其他任何方法,因此我使用嵌套循环…这可能是个坏主意,您有其他方法吗?我认为最好是创建3个示例数据帧,并向问题添加所需的输出。列
IDXType
中有重复项,因此需要使用
min
?我尽量避免循环,因为在熊猫中循环非常慢(但有时是必要的)。另外,不要理解“我所知道的是如何直接写入数据帧,而不是转换为现有数据帧”-你能解释更多吗?谢谢。是的,IDXType可以有100个20或22个。对于“I have is…”部分,很抱歉我的措辞不好,我的意思是“我想要的是一种直接从循环写入数据帧的方式”。(顺便说一句,多个循环和多个索引一样糟糕,这就是我现在学到的)
print (df1.groupby('IDXType')['Datetime'].min())
IDXType
20   2015-01-04
33   2015-01-06
Name: Datetime, dtype: datetime64[ns]

df = pd.concat([df1.groupby('IDXType')['Datetime'].min(),
                df2.groupby('IDXType')['Datetime'].min(),
                df3.groupby('IDXType')['Datetime'].min()], 
               axis=1, 
               keys=('df1','df2','df3')).reindex(value_list).rename_axis(None)
print (df)       
          df1        df2        df3
20 2015-01-04        NaT 2015-01-04
22        NaT        NaT        NaT
28        NaT        NaT        NaT
29        NaT        NaT        NaT
30        NaT 2015-01-04 2015-01-06
31        NaT        NaT 2015-01-07
32        NaT        NaT        NaT
33 2015-01-06        NaT        NaT
index_list = [df1,df2,df3] 
value_list = [20,22,28,29,30,31,32,33]
namesdf = ['df1','df2','df3']   
df5 = pd.concat([x.groupby('IDXType')['Datetime'].min() for x in index_list], 
               axis=1, 
               keys=namesdf).reindex(value_list).rename_axis(None)
print (df5)  
          df1        df2        df3
20 2015-01-04        NaT 2015-01-04
22        NaT        NaT        NaT
28        NaT        NaT        NaT
29        NaT        NaT        NaT
30        NaT 2015-01-04 2015-01-06
31        NaT        NaT 2015-01-07
32        NaT        NaT        NaT
33 2015-01-06        NaT        NaT