Python 使用具有已实现功能的DF

Python 使用具有已实现功能的DF,python,pandas,dataframe,Python,Pandas,Dataframe,嗨,我正在用推特为我的学士学位论文做一些ML。为了规范化df中的数据,我实现了一个函数 def avg_value_over_time(df, day_column: str, target_columns: List[Tuple[str, str]], day_span: int = 90): """ Averages a certain value over time :param df: The dataframe :param

嗨,我正在用推特为我的学士学位论文做一些ML。为了规范化df中的数据,我实现了一个函数

def avg_value_over_time(df, day_column: str, target_columns: List[Tuple[str, str]], day_span: int = 90):
    """
    Averages a certain value over time
    :param df: The dataframe
    :param day_column: The column with the day (datetime)
    :param target_columns: The columns that should be averaged over time (list of tuples of shape (column_name, new_avg_column_name))
    :param day_span: The number of days over which should be averaged
    :return: A new created column with the averaged values
    """

    def apply_func(x):
        day = x[day_column]
        fr, to = day - timedelta(days=day_span), day - timedelta(days=1)
        d = select_by_days(df, day_column, fr, to)

        dct = {n2: d[n1].mean() for n1, n2 in target_columns}

        return pd.Series(dct)

    return df.apply(apply_func, axis=1)
该函数在以下代码中运行得非常好

numMSA_agg = avg_value_over_time(gt_df, 'Date',[('NumMentionsAvg','NumMentionsAvgNorm'), ('NumSourcesAvg', 'NumSourcesAvgNorm'),('NumArticlesAvg', 'NumArticlesAvg')])
但是现在我正在寻找一种方法来迭代我的列并将它们输入到我的函数中。由于scikit库的字数计算,我有3000多列,我不想手动将它们全部添加到我的函数中并对它们进行规范化。因此,我正在寻找一种方法将所有列放入函数中,而不仅仅是使用旧列名+字符串“Norm”为每个迭代列创建一个新列。
提前多谢

下面是一个简单的示例,展示您的问题的解决方案

如果您的数据帧有四列,您希望使用函数对其中的三列进行标准化,那么下面的代码片段可以实现这一目的,而无需手动提供
target\u columns
参数:

cols = df.columns # Which is suppose ['Date','NumMentionsAvg', 'NumSourcesAvg', 'NumArticlesAvg']

cols = cols[1:] # Which in this case selects the columns ['NumMentionsAvg', 'NumSourcesAvg', 'NumArticlesAvg']

target_columns_argument = []

for i in cols:
    target_columns_argument.append((i,i+'Norm'))
在本例中,
target\u cols\u参数
如下所示:

[('NumMentionsAvg', 'NumMentionsAvgNorm'),
 ('NumSourcesAvg', 'NumSourcesAvgNorm'),
 ('NumArticlesAvg', 'NumArticlesAvgNorm')]
因此,您可以按如下方式调用函数:

numsa\u agg=avg\u value\u随时间变化(gt\u df,'Date',target\u columns=target\u columns\u参数)


因此,如果您有3000个列,如果您在代码的第二行中选择了要标准化的列的适当索引,它仍然可以工作。

您是否只想将“Date”参数更改为其他不同的列并迭代调用函数?否,不是Date参数,我想更改我的target_columns变量,这样我就可以迭代我想要规范化的所有列了,所以如果我理解正确,那么“nummentsavg”、“NumSourcesAvg”等是您希望规范化的列,“NumMentionsAvgNorm”、“NumSourcesAvgNorm”是您生成的规范化列。是吗?是的,这是正确的问题是,我有3000多列,我不想手动添加它们,但是target_columns中的第一个参数类似于应该在其上执行规范化的列,第二个参数只是列的新名称uhh看起来很棒而且很简单哈哈,我要试试,谢谢!!酷!如果答案解决了您的问题,请随意接受(在投票部分下方打勾),并将其视为解决方案