python - 简单数据操作 : R vs python

标签 python r pandas data.table

我一直很高兴地使用 R 来进行数据分析。通过数据分析,我的意思是:给定一个相对较小的表(<1 mio 行,<100 列),回答有关数据的“复杂”问题,例如“对于每个实例,在特定时间点变化之前发生的最后一个事件是什么”与实例'等等。

最近我被置于一个人们使用 python 的环境中。据我所知,做这些事情的唯一软件包是 pandas。尽管我已经尝试过,但我仍然在(几周后)进行最简单的操作。让我们考虑这种情况:我正在查看由按“SORT_NR”列排序的不同事件组成的进程(由 PROC_ID 列标识)。出于某些奇怪的原因,我想执行以下操作:给定一个固定的进程 ID proc_id,我想向所有 SORT_NR 添加一个特定的数字“add”,以便 SORT_NR >= start 用于固定参数开始。示例:

PROC_ID | SORT_NR
      A |       1
      A |       2
      A |       3
      A |       4
      A |       5
      B |       1
      B |       2

我现在用 proc_id=A, start=3, add=2 调用这个函数意味着预期的结果是

PROC_ID | SORT_NR
      A |       1
      A |       2
      A |       5 <<< 2 was added
      A |       6 <<< 2 was added
      A |       7 <<< 2 was added
      B |       1
      B |       2

谷歌搜索给了我可以通过以下方式完成的答案

df.loc[(df['PROC_ID'] == proc_id) & (df['SORT_NR'] >= start), 'SORT_NR'] = df.loc[(df['PROC_ID'] == proc_id) & (df['SORT_NR'] >= start), 'SORT_NR'] + add

我在没有格式化的情况下明确地写下它以使其清楚:这个命令一团糟。看着它,你没有机会轻易地理解这是关于什么的。现在让我们看看 R 的 data.table 包中的相应命令:

df[PROC_ID == proc_id & SORT_NR >= start, SORT_NR := SORT_NR + add]

所以我们看到了

  1. 在 pandas 中我们有很多重复(如果你想访问它的列,你总是必须重复 df 这不仅是不必要的,如果你重命名表甚至是有害的)
  2. 我们有额外的完全不必要的特殊字符:' 和方括号。那只会分散注意力。
  3. 总而言之,我们在 pandas 命令中使用了 154 个字符,在 data.table 中使用了 68 个(大约三分之一!)字符

我不想开始“R vs python”的激烈 war ,我只想知道:

我是不是以错误的方式使用了 pandas?是否有隐藏的知识是我无法获得的?

pandas 是不是很“高效”? (从某种意义上说,有很多重复和困惑使事情难以阅读和理解)

第二种情况:为什么这么多人更喜欢 python 而不是 R?

编辑:还有很多令人困惑的例子。我几乎没有执行一个能按预期使用react的命令:

'EXPERIMENT_NUMBER' in process_events.columns
Out[10]: True
'EXPERIMENT_ID' in process_events.columns
Out[11]: True
process_events.drop(['EXPERIMENT_NUMBER', 'EXPERIMENT_ID'])

Traceback (most recent call last):
  ...
    raise KeyError("{} not found in axis".format(labels[mask]))
KeyError: "['EXPERIMENT_NUMBER' 'EXPERIMENT_ID'] not found in axis"

最佳答案

我知道你故意把它写得冗长,但它可以用一个变量和 += 运算符写得更简单

df.loc[(df['PROC_ID'] == proc_id) & (df['SORT_NR'] >= start), 'SORT_NR'] = 
df.loc[(df['PROC_ID'] == proc_id) & (df['SORT_NR'] >= start), 'SORT_NR'] + add

变成:

sorted_procs = (df['PROC_ID'] == proc_id) & (df['SORT_NR'] >= start)
df.loc[sorted_procs, 'SORT_NR'] += add

我不知道 R,但在 Python 中,在复杂的操作中以这种方式构建事物是很常见的,它是 the zen of python 的一部分.我写它的方式更有利于可读性。每一行的作用看一眼就一目了然,以后还可以复用。

您的 R 示例确实看起来更简洁,但 Python 更通用,因此像这样的单行代码不一定符合设计目标。你是对的,有更多的字符来表示某些操作,但那是因为 pandas 是为 python 设计的,它不是“数据优先”类型的语言。

所以回答你的问题,在这种情况下,pandas 有更多的重复,用 zen 写会更容易阅读。

关于python - 简单数据操作 : R vs python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57490815/

相关文章:

pyproject.toml 忽略 python 文件

r - 如何删除 tm 包内带有单词的括号?

删除方面分组变量中没有数据的因素

python - Pandas - 计算具有可变窗口大小的滚动累积乘积

python - 如何对 pandas 中两个不同大小的数据集的列求和

python - 如何将圆盘形掩码应用于 NumPy 数组?

python - 如何正确获取装饰器的默认关键字参数?

javascript - 运行 Selenium Webdriver (Python) 测试时如何加载 Firefox 并禁用 javascript?

r - 可以在 xtable 中创建 latex 多列吗?

python - Pandas 分组7天