在特定日期循环 Dataframe Pandas Python

Posted

技术标签:

【中文标题】在特定日期循环 Dataframe Pandas Python【英文标题】:Loop Dataframe Pandas Python on specific dates 【发布时间】:2018-07-09 21:30:55 【问题描述】:

我正在尝试遍历数据框并获得此处描述的解决方案 Old Post。不知何故,我正在寻找更具体的东西,我刚刚意识到。循环应该计算结果并将每个日期的输出写入 csv 文件,其中 csv 文件包含日期作为文件名,文件中应该是日期和结果。我更喜欢使用循环并扩展代码。

import pandas as pd

def calc_funct(x):

    func = x^2

    return func

def calc_funct2(y):

    func = y^3

    return func

if __name__ == '__main__':

    df = pd.read_csv('C:/Data.csv')

    for index, row in df.iterrows():
        result = []            
        result = (calc_funct(row['x']))
        print(result)

输入如下所示:

           date   x   y   z
    0  2017-11-11  18  17   7
    1  2017-11-11  16  19   3
    2  2017-11-11  13  14   2
    3  2017-11-11  12  13   1
    4  2017-11-11  11  12   9
    5  2017-11-11  10  11  10
    6  2017-11-11  21  10  11
    7  2017-11-12  13  19  12
    8  2017-11-13  18  17  12
    9  2017-11-14   9  10  20
   10  2017-11-15   2  20  13
   11  2017-11-18  13  13   9
   12  2017-11-19  18  14  16
   13  2017-11-20  14  11  19
   14  2017-11-21  18  15  19

为了使它更容易理解,我包含了一个手工制作的示例,我想让它更加自动化,因为我在数据框中获取所有数据,并且只是从中获取正确的数据,这取决于日期并扩展它让它更清楚。也许我的解释太糟糕了,并试图找出一种更容易理解的方式:

   for loop date 1 (2017-11-11):

   result = []

     for loop through values for the dedictaed date (Note every result is an own object at the end):

        result = OwnObject(calc_funct(x),calc_funct2(y/100))

    store results in a csv file with the date given (2017-11-11)   

   Loop date 2 (2017-11-12):
         result = OwnObject(calc_funct(x),calc_funct2(y/100))

    store results in a csv file with the date given (2017-11-12)

等等等等……

OwnObject 暂时没那么重要

【问题讨论】:

“我更喜欢使用循环并只是扩展代码。”为什么?如果您首先使用 pandas,您是否不喜欢矢量化方法(球场,快 100 倍)并在之后使用 to_csv @roganjosh,为什么我更喜欢循环是因为我有更多的功能可以提供,并且只是根据日期从我的数据框中获取提取物。速度不是问题 【参考方案1】:

您可以在 for 循环结束时write csv:

store_result = 
for index, row in df.iterrows():
    result = []
    result = (calc_funct(row['x'], row['y'], row['z']))
    store_result[date] = result
    with open(row["date"] + '.csv', 'wb') as csvfile:
        csv_writer = csv.writer(csvfile)
        csv_writer.writerow(row["date"] + "," + str(result))

【讨论】:

@Thomas,是的,这与我所期待的很接近。如果我不将其存储到 csv 文件中而只是将其用于进一步计算然后存储它会怎样。我只是想确保我真的只是在循环日期。抱歉,如果解释得太复杂了 @MCM 不确定是否理解您的请求。如果您想跟踪结果,您绝对应该使用 pandas。 @MCM 用result = (calc_funct(row['x'], row['y'], row['z'])) 中的result 做任何你想做的事,然后将结果替换为row["date"] + "," + str(result) 而不是result @roganjosh,你能在 Thomas 的结果中显示并在其中编辑吗? @MCM 我不会因为这样的事情而编辑这篇文章。你已经在你的问题中展示了大量的 python 知识来处理这个问题;例如result2 = result * 2 然后csv_writer.writerow(row["date"] + "," + str(result2))。 IMO 这篇文章按原样回答了您的问题。【参考方案2】:

我强烈推荐使用熊猫的方式。那你为什么要使用熊猫呢?轻松读取和保存 csv?

也许这会激励你。

这就是你约会的样子。

df = pd.DataFrame([
['2017-11-11', 18, 17, 7],
['2017-11-11', 16, 19, 3],
['2017-11-12', 10, 4, 5],
['2017-11-11', 1, 2, 3],
], columns=['date', 'x', 'y', 'z'])

首先,您需要确保您的值格式正确。

df.date = pd.to_datetime(df.date)
df.x = pd.to_numeric(df.x)
df.y = pd.to_numeric(df.y)
df.z = pd.to_numeric(df.z)

print(df.date.dtype) # datetime64[ns]

如果您不想在原地应用更改,您可以在新列中轻松完成。

df = df.assign(x2=df.x.apply(calc_funct))
df = df.assign(y2=df.y.apply(calc_funct2))
df

        date   x   y  z  x2  y2
0 2017-11-11  18  17  7  16  18
1 2017-11-11  16  19  3  18  16
2 2017-11-12  10   4  5   8   7
3 2017-11-11   1   2  3   3   1

之后,您可以进行分组、聚合,您可以将计算应用于特定日期的一组结果。

使用这种方法,您可以进行任意数量的计算,这是对绩效和教育的真正投资。

更新

您也可以将对象添加到数据框中。

class OwnObject(object):
    def __init__(self, x2, y2=None):
        self._x2 = x2
        self._y2 = y2

    def __repr__(self):
        # Just for representation reason
        return 'OwnObject(, )'.format((self._x2), (self._y2))

def create_object(row):
    return OwnObject(row.x2, row.y2)

df = df.assign(my_object = df.apply(create_object, axis=1))

df
          date  x   y   z   x2  y2  my_object
0   2017-11-11  18  17  7   16  18  OwnObject(16, 18)
1   2017-11-11  16  19  3   18  16  OwnObject(18, 16)
2   2017-11-12  10  4   5   8   7   OwnObject(8, 7)
3   2017-11-11  1   2   3   3   1   OwnObject(3, 1)

如果要获取所有已创建对象的列表:

list(df.my_object)
# outputs: [OwnObject(16, 18), OwnObject(18, 16), OwnObject(8, 7), OwnObject(3, 1)]

【讨论】:

非常感谢这个例子。我试图让上面的东西更清楚。熊猫也可以这样做吗?我最后不想将它存储在数据框中 我没看清楚你,你是说聚合? OwnObject 只是一个对象,稍后也会存储并用于我在示例中未提及的另一个计算。我认为一般逻辑应该很清楚吧? 非常感谢,你拯救了我的一天!!!!!!!现在我明白你和你的 cmets 一起去哪里了。还有一个问题。如果我定义了一个需要填充两个变量的函数,我从我的数据框中的两个不同列中获取这将如何工作,例如def calc3(x,y) 是的,例如df = df.assign(xy=some_x_calc(df.x) + df.y/100)df = df.assign(xy2=lambda row: sum_x_and_y(row.x, row.y))。如果您不想将新列分配给 df,您可以只写 df.x + df.y。我建议你使用 jupyter notebook 和 pdb 调试器来玩,看看在特定的代码时刻有哪些操作可用。

以上是关于在特定日期循环 Dataframe Pandas Python的主要内容,如果未能解决你的问题,请参考以下文章

根据日期列在pandas Dataframe中插入行

Pandas Dataframe 循环遍历列效率低下

pandas.to_json 以特定形式输出日期格式

用循环生成的连接pandas DataFrames

Pandas:在两个日期之间选择 DataFrame 行(日期时间索引)

在 Pandas DataFrame 中定位第一个和最后一个非 NaN 值