【问题标题】:Is there more efficient way than this if statement for large data in python对于python中的大数据,有没有比这个if语句更有效的方法
【发布时间】:2019-02-26 03:58:48
【问题描述】:

所以我正在处理一个包含 130 万行的大型数据文件。 我想做的很简单,我想在某些条件下更改某些列中的值。

for i in range(0,len(data2)):    #where len(data2) is about 1.3 million
    if data2.loc[i,'PPA']==0:
        data1.loc[i,'LDU']=0        #(data1 and data2 have same amount of rows)

我还需要为其他一些列设置格式。例如,我想将性别格式化为 0 或 1。

数据如下:

    data['Gender']

    Out[156]: 
    0          F
    1          M
    2          F
    3          F
          ..
    1290573    M
    1290574    F
    Name: Gender, Length: 1290575, dtype: object


#Format to 0 and 1
for i in range(0,len(data)):
    if data.loc[i,'Gender']=='F':
        data.loc[i,'Gender']=0;
    else:
        data.loc[i,'Gender']=1

顺便说一句,关于处理时间,我注意到一些不寻常的事情...... 我将前 5000 行保存到一个新的 csv 文件中,当我在示例数据上测试我的代码时,它表现得又好又快,就像 10 秒一样。 但是当我尝试在我的真实数据上运行它时,让它去做

for i in range(0,10000) #instead of the full length of data

大约需要 9 分钟。

上次我在我的完整数据上格式化另一个这样的列(分配 0 和 1)在 python 中花费了 10 多个小时。所以我只是想知道我的代码有什么问题吗?还有其他更有效的方法可以让它更快地读取和重写吗? ...

任何帮助将不胜感激! :)

我是python的新手,这是我的第一个问题帖子,谢谢大家的评论:)

【问题讨论】:

  • 请显示示例输入和示例输出。当然有更有效的方法,你不应该遍历 DF。
  • 能不能先用pandas再用向量化操作? 10 小时听起来很极端,即使是这么多数据
  • data1.loc的类型是什么?我怀疑你会想要使用类似numpy.array 的东西,可能是结构化数组:docs.scipy.org/doc/numpy/user/basics.rec.html 你可能会使用类似data1[data2.loc[i,'PPA']==0, 'LDU'] = 0 的东西。
  • @vash_the_stampede 不,我认为这类问题的 10 小时运行时间实际上是“不起作用”
  • @roganjosh 我听从你的意见

标签: python performance if-statement bigdata processing-efficiency


【解决方案1】:

你可以试试np.where而不是循环

df=pd.DataFrame({'Gender':['M','F']})
df['Numeric_Gender'] = np.where(df.Gender=='M',1,0)
df
Gender  Numeric_Gender
M        1
F        0

【讨论】:

    猜你喜欢
    • 2014-04-06
    • 1970-01-01
    • 1970-01-01
    • 2022-11-01
    • 2021-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多