在特定日期循环Dataframe Pandas Python

时间:2018-01-30 21:33:23

标签: python pandas loops date dataframe

我正在尝试遍历数据框并获得此处描述的解决方案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并不那么重要

2 个答案:

答案 0 :(得分: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))

答案 1 :(得分:1)

我强烈推荐去熊猫的方式。那你为什么要用熊猫呢?要轻松阅读和保存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)]