我有一只DataFrame熊猫:
import pandas as pd
inp = [{'c1':10, 'c2':100}, {'c1':11,'c2':110}, {'c1':12,'c2':120}]
df = pd.DataFrame(inp)
print df
Run Code Online (Sandbox Code Playgroud)
输出:
c1 c2
0 10 100
1 11 110
2 12 120
Run Code Online (Sandbox Code Playgroud)
现在我想迭代这个帧的行.对于每一行,我希望能够通过列的名称访问其元素(单元格中的值).例如:
for row in df.rows:
print row['c1'], row['c2']
Run Code Online (Sandbox Code Playgroud)
是否有可能在熊猫中做到这一点?
我发现了类似的问题.但它没有给我我需要的答案.例如,建议使用:
for date, row in df.T.iteritems():
Run Code Online (Sandbox Code Playgroud)
要么
for row in df.iterrows():
Run Code Online (Sandbox Code Playgroud)
但我不明白row对象是什么以及如何使用它.
好几次,我在matlab,fortran ......中遇到过这个术语......但是我从来没有找到解释是什么意思,它有什么作用?所以我在这里问,什么是矢量化,例如,"循环是矢量化的"是什么意思?
我已经使用pandas操纵了一些数据,现在我想执行批量保存回数据库.这需要我将数据帧转换为元组数组,每个元组对应于数据帧的"行".
我的DataFrame看起来像:
In [182]: data_set
Out[182]:
index data_date data_1 data_2
0 14303 2012-02-17 24.75 25.03
1 12009 2012-02-16 25.00 25.07
2 11830 2012-02-15 24.99 25.15
3 6274 2012-02-14 24.68 25.05
4 2302 2012-02-13 24.62 24.77
5 14085 2012-02-10 24.38 24.61
Run Code Online (Sandbox Code Playgroud)
我想将它转换为元组数组,如:
[(datetime.date(2012,2,17),24.75,25.03),
(datetime.date(2012,2,16),25.00,25.07),
...etc. ]
Run Code Online (Sandbox Code Playgroud)
关于如何有效地做到这一点的任何建议?
我试图访问DataFrame在Pandas中整个应用的函数中的行的索引.我有这样的事情:
df = pandas.DataFrame([[1,2,3],[4,5,6]], columns=['a','b','c'])
>>> df
a b c
0 1 2 3
1 4 5 6
Run Code Online (Sandbox Code Playgroud)
我将定义一个访问具有给定行的元素的函数
def rowFunc(row):
return row['a'] + row['b'] * row['c']
Run Code Online (Sandbox Code Playgroud)
我可以像这样申请:
df['d'] = df.apply(rowFunc, axis=1)
>>> df
a b c d
0 1 2 3 7
1 4 5 6 34
Run Code Online (Sandbox Code Playgroud)
真棒!现在如果我想将索引合并到我的函数中呢?DataFrame添加之前的任何给定行的索引d都是Index([u'a', u'b', u'c', u'd'], dtype='object'),但我想要0和1.所以我不能只访问row.index.
我知道我可以在表中创建一个临时列来存储索引,但是我想知道它是否在某个行对象中存在.
我有一个pandas dataFrame,其中一列如下所示:
In [207]:df2.teams
Out[207]:
0 [SF, NYG]
1 [SF, NYG]
2 [SF, NYG]
3 [SF, NYG]
4 [SF, NYG]
5 [SF, NYG]
6 [SF, NYG]
7 [SF, NYG]
Run Code Online (Sandbox Code Playgroud)
我需要使用pandas将这列列表拆分为2列,名为team1和team2
这是一个自我回答的QnA,旨在指导用户应用的缺陷和好处.
我已经看到很多关于Stack Overflow问题的答案涉及使用apply.我也看到用户评论他们说" apply很慢",应该避免".
我已经阅读了很多关于性能主题的文章,解释apply很慢.我还在文档中看到了一个关于如何apply简单地传递UDF的便利函数的免责声明(现在似乎无法找到).因此,普遍的共识是,apply如果可能,应该避免.但是,这引发了以下问题:
apply是如此糟糕,那为什么它在API中呢?apply- 免费?apply是不错的(比其他可能的解决方案更好)?我正在使用Pandas数据帧,并希望创建一个新列作为现有列的函数.我还没有看到之间的速度差的一个很好的讨论df.apply()和np.vectorize(),所以我想我会问这里.
熊猫apply()功能很慢.根据我的测量结果(如下面的一些实验所示),使用np.vectorize()比使用DataFrame功能快25倍(或更多)apply(),至少在我的2016 MacBook Pro上使用.这是预期的结果,为什么?
例如,假设我有以下带N行的数据框:
N = 10
A_list = np.random.randint(1, 100, N)
B_list = np.random.randint(1, 100, N)
df = pd.DataFrame({'A': A_list, 'B': B_list})
df.head()
# A B
# 0 78 50
# 1 23 91
# 2 55 62
# 3 82 64
# 4 99 80
Run Code Online (Sandbox Code Playgroud)
进一步假设我想创建一个新列作为两列的函数A和B.在下面的例子中,我将使用一个简单的函数divide().要应用该功能,我可以使用df.apply()或np.vectorize():
def divide(a, b):
if b == 0:
return …Run Code Online (Sandbox Code Playgroud) 我需要遍历 Pandas 数据帧,以便将每一行作为函数(实际上是类构造函数)的参数传递给**kwargs. 这意味着每一行都应该像一个字典,键是列名,值是每行对应的列名。
这有效,但它的表现非常糟糕:
import pandas as pd
def myfunc(**kwargs):
try:
area = kwargs.get('length', 0)* kwargs.get('width', 0)
return area
except TypeError:
return 'Error : length and width should be int or float'
df = pd.DataFrame({'length':[1,2,3], 'width':[10, 20, 30]})
for i in range(len(df)):
print myfunc(**df.iloc[i])
Run Code Online (Sandbox Code Playgroud)
关于如何提高性能的任何建议?我尝试使用 try 进行迭代df.iterrows(),但出现以下错误:
类型错误:** 之后的 myfunc() 参数必须是映射,而不是元组
我也试过df.itertuples()and df.values,但要么我遗漏了一些东西,要么意味着我必须将每个元组/ np.array 转换为 pd.Series 或 dict ,这也会很慢。我的限制是脚本必须使用 python 2.7 和 pandas 0.14.1。
我想将“UserId”中的最后一位数字存储在一个新变量中(此类 UserId 是字符串类型)。
我想出了这个,但这是一个很长的 df 并且需要永远。关于如何优化/避免 for 循环的任何提示?
df['LastDigit'] = np.nan
for i in range(0,len(df['UserId'])):
df.loc[i]['LastDigit'] = df.loc[i]['UserId'].strip()[-1]
Run Code Online (Sandbox Code Playgroud) 我是一个Python新手并拥有以下pandas数据帧 - 我正在尝试编写填充'signal'列的代码,如下所示:
Days long_entry_flag long_exit_flag signal
1 FALSE TRUE
2 FALSE FALSE
3 TRUE FALSE 1
4 TRUE FALSE 1
5 FALSE FALSE 1
6 TRUE FALSE 1
7 TRUE FALSE 1
8 FALSE TRUE
9 FALSE TRUE
10 TRUE FALSE 1
11 TRUE FALSE 1
12 TRUE FALSE 1
13 FALSE FALSE 1
14 FALSE TRUE
15 FALSE FALSE
16 FALSE TRUE
17 TRUE FALSE 1
18 TRUE FALSE 1
19 FALSE FALSE 1
20 FALSE FALSE 1 …Run Code Online (Sandbox Code Playgroud) pandas ×9
python ×8
dataframe ×3
performance ×3
apply ×1
arrays ×1
list ×1
numpy ×1
python-2.7 ×1
python-3.x ×1
rows ×1
split ×1