我一直很高兴地使用 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]
所以我们看到了
- 在 pandas 中我们有很多重复(如果你想访问它的列,你总是必须重复 df 这不仅是不必要的,如果你重命名表甚至是有害的)
- 我们有额外的完全不必要的特殊字符:' 和方括号。那只会分散注意力。
- 总而言之,我们在 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/