【问题标题】:Python: Apply function every 100 rows of large dataframePython:每 100 行大数据帧应用一次函数
【发布时间】:2021-10-06 18:22:28
【问题描述】:

我有一个大约 25,000 行的大型数据集。我正在尝试为我的每一个观察结果提取高程数据。但是,我一次只能发出 100 个请求。这意味着我需要大约 250 次拆分来提出单独的请求!

我想知道是否有有效的方法来做到这一点?

我遇到了这种情况,但我不想重复这 250 次并每次都应用该函数。

first_hun = pd.DataFrame()
rest = pd.DataFrame()

if df.shape[0] > 100: # len(df) > 100 would also work
    first_hun = df[:100]
    rest = df[100:]

以“粗略”的方式,这是我正在尝试的:

for index,row in df.iterrows():
    
    # split df every 100 rows
        # apply elevation function (my_function)
        # store the 100 elevation values
        
    # concat the 250 elevation values so they're in the same list
    
# add list to original df

【问题讨论】:

  • df.loc[[i for i in range(df.shape[0]) if i%100==0]] 如果数据框具有正常的数值范围索引值。

标签: python pandas dataframe for-loop split


【解决方案1】:

为了测试,让我们将源 DataFrame 创建为:

df = pd.DataFrame({'A': np.arange(101, 122, 2)})

假设您的函数为源的一个子集生成海拔 数据框是:

def myFun(src, txt):
    return txt + src.A.astype(str)

然后您可以将新列生成为连续的连接 调用 df 的子集为:

tt = 'ABC'
n = len(tt)
df['Elev'] = pd.concat([ myFun(df[i::n], x) for i, x in enumerate(tt) ])

详情:

  • tt 是源字符串 - 要附加到源列的字母列表。
  • n 是生成 df 的每个源子集的步骤。
  • for i, x in...tt 及其索引中检索连续的字母。 i 是源子集的编号,同时也是起始子集的编号 dfx 中的点是要添加到 结果。
  • df[i::n] 选择源 DataFrame 的子集。
  • pd.concat 连接部分结果。

结果是:

      A  Elev
0   101  A101
1   103  B103
2   105  C105
3   107  A107
4   109  B109
5   111  C111
6   113  A113
7   115  B115
8   117  C117
9   119  A119
10  121  B121

如您所见,以 A 开头的值来自第一个 调用,值以 B 从第二个开始,依此类推。

如果由于某种原因您不能使用列表推导式,您可以 在“普通”循环中执行,例如:

res = []
for i, x in enumerate(tt):
    res.append(myFun(df[i::n], x))
df['Elev'] = pd.concat(res)

【讨论】:

    【解决方案2】:

    您可以创建一个仅每 100 个值递增的系列,并使用它来对数据框进行分组。我正在使用一个较小的示例来适应屏幕并显示一些处理选项。

    import pandas as pd
    import numpy as np
    df = pd.DataFrame({"FOO":list(range(50))})
    
    # using each group
    for idx, grp in df.groupby(np.arange(len(df))//5):
        print(idx, grp.FOO.values)
    
    # using a pandas chained method
    result = df.groupby(np.arange(len(df))//5).sum()
    print(result)
    
    # applying your own function to the group dataframes
    df.groupby(np.arange(len(df))//5).apply(lambda df: print(df.FOO.values))
    

    【讨论】:

      猜你喜欢
      • 2020-02-21
      • 2017-12-05
      • 1970-01-01
      • 2021-07-09
      • 1970-01-01
      • 2018-12-30
      • 2021-01-11
      • 1970-01-01
      • 2022-01-06
      相关资源
      最近更新 更多