相关疑难解决方法(0)

如何迭代Pandas中的DataFrame中的行?

我有一只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对象是什么以及如何使用它.

python rows dataframe pandas

1551
推荐指数
28
解决办法
199万
查看次数

什么是"矢量化"?

好几次,我在matlab,fortran ......中遇到过这个术语......但是我从来没有找到解释是什么意思,它有什么作用?所以我在这里问,什么是矢量化,例如,"循环是矢量化的"是什么意思?

vectorization

154
推荐指数
6
解决办法
6万
查看次数

Pandas将数据帧转换为元组数组

我已经使用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)

关于如何有效地做到这一点的任何建议?

python pandas

106
推荐指数
8
解决办法
12万
查看次数

获取pandas应用函数中的行索引

我试图访问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.

我知道我可以在表中创建一个临时列来存储索引,但是我想知道它是否在某个行对象中存在.

dataframe python-2.7 pandas

96
推荐指数
3
解决办法
6万
查看次数

Pandas将列表列分成多列

我有一个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

python split list dataframe pandas

86
推荐指数
9
解决办法
9万
查看次数

我什么时候应该在我的代码中使用pandas apply()?

这是一个自我回答的QnA,旨在指导用户应用的缺陷和好处.

我已经看到很多关于Stack Overflow问题的答案涉及使用apply.我也看到用户评论他们说" apply很慢",应该避免".

我已经阅读了很多关于性能主题的文章,解释apply很慢.我还在文档中看到了一个关于如何apply简单地传递UDF的便利函数的免责声明(现在似乎无法找到).因此,普遍的共识是,apply如果可能,应该避免.但是,这引发了以下问题:

  1. 如果apply是如此糟糕,那为什么它在API中呢?
  2. 我应该如何以及何时制作我的代码apply- 免费?
  3. 是否有过任何地方的情况apply不错的(比其他可能的解决方案更好)?

python performance apply pandas

68
推荐指数
3
解决办法
8380
查看次数

Pandas的性能适用于np.vectorize以从现有列创建新列

我正在使用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)

进一步假设我想创建一个新列作为两列的函数AB.在下面的例子中,我将使用一个简单的函数divide().要应用该功能,我可以使用df.apply()np.vectorize():

def divide(a, b):
    if b == 0:
        return …
Run Code Online (Sandbox Code Playgroud)

python arrays performance numpy pandas

44
推荐指数
2
解决办法
1万
查看次数

将 Pandas DataFrame 的行作为字典进行迭代

我需要遍历 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。

python performance pandas

17
推荐指数
3
解决办法
2万
查看次数

Python。从 Pandas 列中提取字符串的最后一个字母

我想将“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 python-3.x pandas

10
推荐指数
1
解决办法
2万
查看次数

使用第1列和第2列填充第3列

我是一个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)

python pandas

10
推荐指数
2
解决办法
560
查看次数