在python中将循环的结果写入数据帧
我需要每天检查索引值的列表,为了便于阅读,我将它们放入数据框中。我正在使用Python 2.7 首先,我将答案输出到一个列表中:在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"] ==
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