【问题标题】:Define start and end date of several DataFrames with pandas用 pandas 定义几个 DataFrame 的开始和结束日期
【发布时间】:2022-01-12 11:54:45
【问题描述】:

我有很多DataFrames,它们的周期长度不同。我正在尝试创建一个 for loop 来为所有这些 DataFrame 定义一个特定的开始和结束日期。

这是一个简单的例子:

df1:
    Dates       ID1 ID2
0   2021-01-01  0   1
1   2021-01-02  0   0
2   2021-01-03  1   0
3   2021-01-04  2   2
4   2021-01-05  1   4
5   2021-01-06  -1  -2

df2:
    Dates       ID1 ID2
0   2021-01-01  0   1
1   2021-01-02  1   2
2   2021-01-03  -1  3
3   2021-01-04  1   -1
4   2021-01-05  4   2

我想将特定的开始和结束日期定义为:

start = pd.to_datetime('2021-01-02')
end = pd.to_datetime('2021-01-04')

到目前为止,我只知道如何定义一个DataFrame的句点:

df1.loc[(df1['Dates'] >= start) & (df1['Dates'] <= end)]

有没有一种简单的方法可以同时遍历所有DataFrames 来定义开始和结束日期?

为了重现性:

import pandas as pd
df1 = pd.DataFrame({
    'Dates':['2021-01-01', '2021-01-02', '2021-01-03', '2021-01-04', '2021-01-05', '2021-01-06'],
    'ID1':[0,0,1,2,1,-1], 
    'ID2':[1,0,0,2,4,-2]})
df1['Dates'] = pd.to_datetime(df1['Dates'])

df2 = pd.DataFrame({
    'Dates':['2021-01-01', '2021-01-02', '2021-01-03', '2021-01-04', '2021-01-05'],
    'ID1':[0,1,-1,1,4], 
    'ID2':[1,2,3,-1,2]})
df2['Dates'] = pd.to_datetime(df2['Dates'])

【问题讨论】:

    标签: python pandas dataframe for-loop


    【解决方案1】:

    您可以将您的数据帧存储在一个列表中,然后使用list 理解将您的loc 公式应用于列表中的所有数据帧,并返回一个新的过滤数据帧列表:

    # Create a list with your dataframes
    dfs = [df1 , df2]
    
    # Thresholds
    start = pd.to_datetime('2021-01-02')
    end = pd.to_datetime('2021-01-04')
    
    # Filter all of them and store back
    filtered_dfs = [df.loc[(df['Dates'] >= start) & (df['Dates'] <= end)] for df in dfs]
    

    结果:

    >>> print(filtered_dfs)
    
    [       Dates  ID1  ID2
     1 2021-01-02    0    0
     2 2021-01-03    1    0
     3 2021-01-04    2    2,
            Dates  ID1  ID2
     1 2021-01-02    1    2
     2 2021-01-03   -1    3
     3 2021-01-04    1   -1]
    
    
    >>> print(dfs)
    
    [       Dates  ID1  ID2
     0 2021-01-01    0    1
     1 2021-01-02    0    0
     2 2021-01-03    1    0
     3 2021-01-04    2    2
     4 2021-01-05    1    4
     5 2021-01-06   -1   -2,
            Dates  ID1  ID2
     0 2021-01-01    0    1
     1 2021-01-02    1    2
     2 2021-01-03   -1    3
     3 2021-01-04    1   -1
     4 2021-01-05    4    2]
    

    【讨论】:

    • 非常感谢您的回答。因为我有很多数据集,是否也可以直接获取单个数据集而不是全部组合在过滤后的_dfs中?否则我必须从filtered_dfs中再次选择全部。
    • 要使用 for 循环,尽管您需要将它们放在一个地方。否则你将如何遍历它们?也许您可以使用上述方法,然后将数据帧列表(或字典)分解为单个对象?
    • 好的,我明白了,谢谢
    • 我个人更喜欢将数据帧存储在字典中,就像将名称作为键一样,这样我就可以使用它们的名称来引用它们df_dict[df1] 指的是df1df_dict[df2] 指的是@987654328 @等等。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-19
    • 1970-01-01
    • 1970-01-01
    • 2012-08-19
    • 2019-07-06
    • 2022-01-23
    • 1970-01-01
    相关资源
    最近更新 更多