我熟悉"矢量化"的概念,以及熊猫如何使用矢量化技术来加速计算.矢量化函数在整个系列或DataFrame上广播操作,以实现比传统迭代数据更大的加速.
但是,我很惊讶地看到很多代码(包括Stack Overflow的答案)提供了解决问题的方法,这些问题涉及使用for循环和列表推导来循环数据.阅读完文档后,对API有了不错的理解,我认为循环是"坏的",并且应该"永远"迭代数组,系列或DataFrame.那么,为什么我会不时地看到用户提出循环解决方案呢?
因此,要总结......我的问题是:
是否for循环真正的"坏"?如果不是,在什么情况下它们会比使用更传统的"矢量化"方法更好?1
1 - 虽然这个问题确实听起来有点宽泛,但事实是,当for循环通常比传统的迭代数据更好时,存在非常具体的情况.这篇文章旨在为后人捕捉这一点.
我有一个DataFrame包含多个列的pandas :
Index: 239897 entries, 2012-05-11 15:20:00 to 2012-06-02 23:44:51
Data columns:
foo 11516 non-null values
bar 228381 non-null values
Time_UTC 239897 non-null values
dtstamp 239897 non-null values
dtypes: float64(4), object(1)
Run Code Online (Sandbox Code Playgroud)
where foo和bar是包含相同数据的列,但命名方式不同.是否有移动从而弥补了行的方式foo进入bar,最好同时保持的名字bar?
最后,DataFrame应显示为:
Index: 239897 entries, 2012-05-11 15:20:00 to 2012-06-02 23:44:51
Data columns:
bar 239897 non-null values
Time_UTC 239897 non-null values
dtstamp 239897 non-null values
dtypes: float64(4), object(1)
Run Code Online (Sandbox Code Playgroud)
这就是组成bar的NaN值被来自的值替换foo.
这个问题与之前发布的相同.我想连接三列而不是连接两列:
这是结合两列:
df = DataFrame({'foo':['a','b','c'], 'bar':[1, 2, 3], 'new':['apple', 'banana', 'pear']})
df['combined']=df.apply(lambda x:'%s_%s' % (x['foo'],x['bar']),axis=1)
df
bar foo new combined
0 1 a apple a_1
1 2 b banana b_2
2 3 c pear c_3
Run Code Online (Sandbox Code Playgroud)
我想用这个命令组合三个列,但它不起作用,任何想法?
df['combined']=df.apply(lambda x:'%s_%s' % (x['bar'],x['foo'],x['new']),axis=1)
Run Code Online (Sandbox Code Playgroud) 给定一个数据帧df,(现实生活是+1000行df).元素ColB是列表列表.
ColA ColB
0 'A' [['a','b','c'],['d','e','f']]
1 'B' [['f','g','h'],['i','j','k']]
2 'A' [['l','m','n'],['o','p','q']]
Run Code Online (Sandbox Code Playgroud)
如何ColC使用不同列中的元素有效地创建一个字符串,如下所示:
ColC
'A>+a b:c,+d e:f'
'B>+f g:h,+i j:k'
'A>+l m:n,+o p:q'
Run Code Online (Sandbox Code Playgroud)
我尝试了df.apply这些方法,灵感来自于:
df['ColC'] = df.apply(lambda x:'%s>' % (x['ColA']),axis=1)
Run Code Online (Sandbox Code Playgroud)
这适用于字符串的前2个元素.其余的都很难过.
我正在尝试在Pandas中构造一个datetime列,该列代表描述年,月,日等的多个列。我在该主题上可以找到的其他大多数答案都涉及相反方向的处理数据(从datetime到integer hour,对于实例)。
df = pd.DataFrame()
df['year'] = [2019, 2019, 2019, 2019, 2019, 2019]
df['month'] = [8, 8, 8, 8, 8, 8]
df['day'] = [1, 1, 1, 1, 1, 1]
df['hour'] = [10,10,11,11,12,12]
df['minute'] = [15,45,20,40,10,50]
df['second'] = [0, 1, 5, 10, 10, 11]
Run Code Online (Sandbox Code Playgroud)
目标:
df['datetime_val'] =
0 2019-08-01 10:15:00
1 2019-08-01 10:45:01
2 2019-08-01 11:20:05
3 2019-08-01 11:40:10
4 2019-08-01 12:10:10
5 2019-08-01 12:50:11
Name: datetime_vals, dtype: datetime64[ns]
Run Code Online (Sandbox Code Playgroud)
在上面的示例中,如何快速创建一个代表组成时间信息的datetime列?我可以使用.apply()和一个辅助函数轻松地做到这一点,但我设想对数百万行执行此操作。我喜欢内置/矢量化的东西。谢谢!
问题
如何根据pandas DataFrame 的值创建带有占位符(即“f-string”之类的)的字符串列表?
例子
想象一下我有以下数据框:
import pandas as pd
data = [
['Alice', 13, 'apples'],
['Bob', 17, 'bananas']
]
df = pd.DataFrame(
data,
columns=['name', 'qty', 'fruit']
)
Run Code Online (Sandbox Code Playgroud)
如何使用类似f"{name} ate {qty} {fruit}"模式创建字符串列表?
换句话说,如何创建以下列表:
[
'Alice ate 13 apples',
'Bob ate 17 bananas'
]
Run Code Online (Sandbox Code Playgroud)