我如何有效地基于以前的数据帧更新和创建新的数据帧?

时间:2018-12-19 12:04:29

标签: python python-3.x pandas

在这里,我正在根据以前的数据清除数据,但是当我运行此数据时。它运行良好,但是在1000行中测量时间会花费更多时间。

这只是我正在做的一个示例,我可以屏蔽或计算更复杂的算法和方法上的数据。

可以建议采取任何增强措施或处理措施来在更短的时间内非常有效地进行处理吗?

import pandas as pd
import numpy as np


def method_1(data):
    return (data['A'] + 1) + (data['B'] * data['D'])


def method_2(data):
    if data['E'] == 'test' and data['D'] == 4:
        return 'test_1'
    elif data['E'] == 'train':
        return 'test_2'
    else:
        return None


def new_data():
    df = pd.DataFrame({'A': 1.,
                       'B': np.array([3] * 4),
                       'C': pd.Series(1, index=list(range(4)), dtype='float32'),
                       'D': np.array([3, 1, 4, 4], dtype='int32'),
                       'E': pd.Categorical(["test", "train", "test", "train"]),
                       'F': 'foo'})

    # Output
    #        A B    C  D      E    F
    #   0  1.0 3  1.0  3   test  foo
    #   1  1.0 3  1.0  3  train  foo
    #   2  1.0 3  1.0  3   test  foo
    #   3  1.0 3  1.0  3  train  foo

    n_df = []
    for i, row in df.iterrows():
        d = pd.Series()
        d['A_1'] = method_1(row)
        d['E_1'] = method_2(row)
        d['A'] = row['A']
        d['B'] = row['B']
        d['C'] = row['C']

        n_df.append(d)

    n_df = pd.DataFrame.from_records(n_df)

    print(n_df)

    # Output

    #       A_1     E_1    A  B    C
    #   0  10.0    None  1.0  3  1.0
    #   1   4.0  test_2  1.0  3  1.0
    #   2  13.0  test_1  1.0  3  1.0
    #   3  13.0  test_2  1.0  3  1.0

1 个答案:

答案 0 :(得分:0)

由于我目前无法添加评论,因此我将在此处进行撰写和进行修改,以便为您提供帮助。

看起来这里有一个 typo (即使它仍然运行):

def method_1(data):
    return data['A'] + 1 * + data['B'] * data['D']
                          ^

此外,这些行:

'B': np.array([3] * 4),
'D': np.array([3, 1, 4, 4], dtype='int32'),

应再现与您提供的输出不同的输出:

#                B  D                              B  D
#   0   2013-01-02  3                          0   3  3
#   1   2013-01-02  3   ----> should be ---->  1   3  1
#   2   2013-01-02  3                          2   3  4
#   3   2013-01-02  3                          3   3  4

您可以查看一下,以便我更好地了解您的方法在做什么吗?


我一直在努力解决它,而忽略了我上面指出的小问题。以下代码可能会为您全部设置好:

df = pd.DataFrame({'A': 1.,
                   'B': np.full(4,3),
                   'C': pd.Series(1, index=list(range(4)), dtype='float32'),
                   'D': np.array([3, 1, 4, 4], dtype='int32'),
                   'E': pd.Categorical(["test", "train", "test", "train"]),
                   'F': 'foo'})


n_df = df.copy()

n_df['A_1'] = df['A'] + df['B'] * df['D']

n_df['E_1'] = ['test_1' if (df['E'][i] == 'test' and df['D'][i] == 4) 

                        else 'test_2' if (df['E'][i] == 'train') else None for i in df.index]