在特定日期循环数据帧熊猫蟒蛇



我正在尝试循环数据帧并得到了此处描述的解决方案 旧帖子. 不知何故,我正在寻找更具体的东西,这是我刚刚意识到的。循环应计算结果并将每个日期的输出写入 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并不那么重要

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

你可以在 for 循环的末尾写 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))

最新更新