【问题标题】:Optimization RunTime of DataFrame Split in Sub DataFrames in PythonPython中子数据帧中数据帧拆分的优化运行时间
【发布时间】:2020-12-12 21:04:47
【问题描述】:

我确实有一个 pandas DF (df_main),我尝试将其拆分为不同的子集。数据集如下所示:

a b c d e f

1 1 1 2 1 2   1.

2 3 2 1 2 1   2.

3 1 3 1 3 1   3.

3 2 1 3 4 1   4.

3 1 3 4 2 1   5.

2 1 2 3 4 2   6.

1 2 3 4 5 3   7.

我想根据a列的元素将完整的df拆分为3个子集。

子集 1:col(a) 的值增加,因此 1., 2., 3.

子集 2:col(a) 的值保持不变,因此为 3.、4.、5。

子集 3:col (a) 的值递减,因此 5., 6., 7.

我的代码现在看起来像这样:

df1_new = pd.DataFrame(columns=['a', 'b', 'c', 'd', 'e', 'f'])
df2_new = pd.DataFrame(columns=['a', 'b', 'c', 'd', 'e', 'f'])
df3_new = pd.DataFrame(columns=['a', 'b', 'c', 'd', 'e', 'f'])

for j in range(len(df_main['a'])):
    if df_main['a'][j] == df_main['a'][j + 1]:
        df1_new = df1_new.append(df_main.iloc[j])
    if df_main['a'][j] > df_main['a'][j + 1]:
        df2_new = df2_new.append(df_main.iloc[j])
    if df_main['a'][j] < df_main['a'][j + 1]:
        df3_new = df3_new.append(df_main.iloc[j])

由于 df_main 的长度为 1 353 419 行,它需要 (atm) 大约 15 小时才能完成一次运行。

是否有任何选项可以优化它运行 df 并拆分它所需的时间?

我对 numpy 矢量化有一点看法,但我不确定这是否是一个合适的解决方法。

可以在这里看到基于递增、递减和常量值的模式

【问题讨论】:

  • 您的 df 是否总是包含先递增的值,然后是相同的值,然后是递减的值?
  • 你好 Shubham,不,它并不总是遵循相同的模式。我将添加模式的可视化。
  • 所以你想要一组中所有增加的值,另一组中所有减少的值......,对吗?
  • 正确,如果 value[i] == value[i+1] 我想要第三个子集中的数据元组。我的主要问题是运行时,它太长了。

标签: python pandas dataframe optimization


【解决方案1】:

使用Series.gtSeries.ltSeries.eq以及Series.shift创建布尔掩码m1m2m3,然后使用这些掩码过滤/拆分相应类别中的数据框increasingdecreasingconstant

s1, s2 = df['a'].shift(), df['a'].shift(-1)

m1 = df['a'].gt(s1) | df['a'].lt(s2)
m2 = df['a'].lt(s1) | df['a'].gt(s2)
m3 = df['a'].eq(s1) | df['a'].eq(s2)

incr, decr, const = df[m1], df[m2], df[m3]

结果:

print(incr)
   a  b  c  d  e  f  g
0  1  1  1  2  1  2  1
1  2  3  2  1  2  1  2
2  3  1  3  1  3  1  2

print(decr)
   a  b  c  d  e  f  g
4  3  1  3  4  2  1  4
5  2  1  2  3  4  2  1
6  1  2  3  4  5  3  1

print(const)
   a  b  c  d  e  f  g
2  3  1  3  1  3  1  2
3  3  2  1  3  4  1  3
4  3  1  3  4  2  1  4

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 2021-11-08
    • 1970-01-01
    • 2020-09-20
    • 2020-03-07
    相关资源
    最近更新 更多