相关疑难解决方法(0)

为什么np.where比pd.apply更快

示例代码在这里

import pandas as pd
import numpy as np

df = pd.DataFrame({'Customer' : ['Bob', 'Ken', 'Steve', 'Joe'],
                   'Spending' : [130,22,313,46]})

#[400000 rows x 4 columns]
df = pd.concat([df]*100000).reset_index(drop=True)

In [129]: %timeit df['Grade']= np.where(df['Spending'] > 100 ,'A','B')
10 loops, best of 3: 21.6 ms per loop

In [130]: %timeit df['grade'] = df.apply(lambda row: 'A' if row['Spending'] > 100 else 'B', axis = 1)
1 loop, best of 3: 7.08 s per loop
Run Code Online (Sandbox Code Playgroud)

问题来自:https://stackoverflow.com/a/41166160/3027854

python numpy pandas

7
推荐指数
1
解决办法
1710
查看次数

Pandas - 在applymap期间检索每个元素的行名和列名

我试图比较2个字符串列表的相似性,并将它们呈现在熊猫数据框中以供检查; 所以我使用1个列表作为索引,另一个作为列列表.然后我想计算它们上的"Levenshtein相似性"(比较两个单词之间的相似性的函数).

我试图通过使用应用映射来实现这一点,它将进入每个单元格,并将单元格索引与单元格列进行比较.但我怎么能这样做?或者可能会有一些更简单的方法?

things = ['car', 'bike', 'sidewalk', 'eatery']
action = ['walking', 'caring', 'biking', 'eating']
matrix = pd.DataFrame(index = things, columns = action)

def lev(x):
    x = Levenshtein.distance(x.index, x.column)  
matrix.applymap(lev)
Run Code Online (Sandbox Code Playgroud)

到目前为止,我使用以下(下面),但我发现它笨拙和缓慢

matrix = pd.DataFrame(data = [action for i in things], index = things, columns = action)
for i, values in matrix.iterrows():
    for j, value in enumerate(values):
        matrix.ix[i,j] = Levenshtein.distance(i, value) 
Run Code Online (Sandbox Code Playgroud)

python pandas

7
推荐指数
2
解决办法
4143
查看次数

熊猫VS SQL速度

关于何时应该使用Pandas与何时使用SQL,我听到了不同的看法.

我尝试在Pandas中对19,150,869行数据执行以下操作:

for idx, row in df.iterrows():
    tmp = int((int(row['M']) / PeriodGranularity))+1
    row['TimeSlot'] = str(row["D"]+1) + "-" + str(row["H"]) + "-" + str(tmp)
Run Code Online (Sandbox Code Playgroud)

并且发现它花了这么长时间我不得不在20分钟后中止.

我在SQLLite中执行了以下操作:

Select strftime('%w',PlayedTimestamp)+1 as D,strftime('%H',PlayedTimestamp) as H,strftime('%M',PlayedTimestamp) as M,cast(strftime('%M',PlayedTimestamp) / 15+1 as int) as TimeSlot from tblMain
Run Code Online (Sandbox Code Playgroud)

并发现它耗时4秒("在2445ms内返回19150869行").

注意:对于Pandas代码,我在它之前的步骤中运行它以从db获取数据:

sqlStr = "Select strftime('%w',PlayedTimestamp)+1 as D,strftime('%H',PlayedTimestamp) as H,strftime('%M',PlayedTimestamp) as M from tblMain"
df = pd.read_sql_query(sqlStr, con)
Run Code Online (Sandbox Code Playgroud)

这是我的编码在这里有问题还是普遍接受的是,对于某些任务,SQL速度要快得多?

sql sqlite pandas

6
推荐指数
1
解决办法
4604
查看次数

Pandas Dataframe检查列值是否在列列表中

我有一个数据框df

data = {'id':[12,112],
        'idlist':[[1,5,7,12,112],[5,7,12,111,113]]
       }
df=pd.DataFrame.from_dict(data)
Run Code Online (Sandbox Code Playgroud)

看起来像这样:

    id                idlist
0   12    [1, 5, 7, 12, 112]
1  112  [5, 7, 12, 111, 113]
Run Code Online (Sandbox Code Playgroud)

我需要检查是否id在中idlist,然后选择或标记它。我尝试了以下变化并收到注释的错误:

df=df.loc[df.id.isin(df.idlist),:] #TypeError: unhashable type: 'list'
df['flag']=df.where(df.idlist.isin(df.idlist),1,0) #TypeError: unhashable type: 'list'
Run Code Online (Sandbox Code Playgroud)

一些可能的其他解决方法将.apply在列表理解中?

我在这里寻找一个解决方案,要么选择其中的行ididlist,或标志为1,其中排ididlist。结果df应为:

   id              idlist
0  12  [1, 5, 7, 12, 112]
Run Code Online (Sandbox Code Playgroud)

要么:

   flag   id                idlist
0     1   12    [1, 5, 7, 12, 112]
1     0  112  [5, …
Run Code Online (Sandbox Code Playgroud)

python list-comprehension where apply pandas

6
推荐指数
1
解决办法
4454
查看次数

如何使用 Python Pandas 在特定切片中制作 DataFrame 切片和“fillna”?

问题:让我们从 Kaggle 中获取 Titanic 数据集。我有包含“Pclass”、“Sex”和“Age”列的数据框。我需要在“年龄”列中用某个组的中位数填充 NaN。如果是 1st class 的女性,我想用 1st class 女性的中位数填充她的年龄,而不是整个 Age 列的中位数。

问题是如何在某个切片中进行这种更改?

我试过:

data['Age'][(data['Sex'] == 'female')&(data['Pclass'] == 1)&(data['Age'].isnull())].fillna(median)
Run Code Online (Sandbox Code Playgroud)

“中位数”是我的价值,但没有任何变化“就地=真”没有帮助。

非常感谢!

python data-analysis dataframe pandas

5
推荐指数
1
解决办法
2111
查看次数

用熊猫中的另一个值替换某些列中的所有负值

假设我有四个连续排列的列作为数据框的一部分,并且我想用另一个值(假设为 -5)替换这 4 列中的所有负值,我该怎么做?

T1   T2  T3  T4
20   -5  4   3
85  -78  34  21
-45  22  31  75
-6   5   7  -28
Run Code Online (Sandbox Code Playgroud)

从逻辑上讲,我希望这会奏效。但是,它没有。

for i in df.iloc[:,df.columns.get_loc("T1"):df.columns.get_loc("T1")+4]<0:
    for j in df[i]:
        if j<0:
            j=-5
Run Code Online (Sandbox Code Playgroud)

python replace dataframe pandas

5
推荐指数
1
解决办法
6492
查看次数

如何将 pandas 数据框转换为带有列名的 numpy 数组

  • 这必须使用向量化方法,无需迭代

我想从 pandas 数据帧创建一个 numpy 数组。

我的代码:

import pandas as pd
_df = pd.DataFrame({'itme': ['book', 'book' , 'car', ' car', 'bike', 'bike'], 'color': ['green', 'blue' , 'red', 'green' , 'blue', 'red'], 'val' : [-22.7, -109.6, -57.19, -11.2, -25.6, -33.61]})
 
item     color    val
book    green   -22.70
book    blue    -109.60
car     red     -57.19
car     green   -11.20
bike    blue    -25.60
bike    red     -33.61
Run Code Online (Sandbox Code Playgroud)

大约有 12,000 万行。

我需要创建一个 numpy 数组,例如:

item    green    blue     red
book    -22.70  -109.60   null
car     -11.20   null     -57.19
bike    null …
Run Code Online (Sandbox Code Playgroud)

python numpy dataframe pandas pytorch

5
推荐指数
1
解决办法
2313
查看次数

如何在迭代 pandas 数据框时显示进度条

我正在尝试迭代包含近一百万个条目的 Pandas 数据框。我正在使用 for 循环来迭代它们。以下面的代码为例

import pandas as pd 
import os 
from requests_html import HTMLSession
from tqdm import tqdm
import time


df = pd.read_csv(os.getcwd()+'/test-urls.csv')
df = df.drop('Unnamed: 0', axis=1 )

new_df = pd.DataFrame(columns = ['pid', 'orig_url', 'hosted_url'])
refused_df = pd.DataFrame(columns = ['pid', 'refused_url'])

tic = time.time()

for idx, row in df.iterrows():

    img_id = row['pid']
    url = row['image_url']

    #Let's do scrapping 
    session = HTMLSession()
    r  = session.get(url)
    r.html.render(sleep=1, keep_page=True, scrolldown=1)

    count = 0 
    link_vals =  r.html.find('.zoomable')

    if len(link_vals) != 0 : …
Run Code Online (Sandbox Code Playgroud)

python pandas progress-bar tqdm

4
推荐指数
1
解决办法
7132
查看次数

如何将值添加到熊猫数据框中的新列?

我想在 Pandas 数据框中创建一个新的命名列,将第一个值插入其中,然后向同一列添加另一个值:

就像是:

import pandas

df = pandas.DataFrame()
df['New column'].append('a')
df['New column'].append('b')
df['New column'].append('c')

etc.
Run Code Online (Sandbox Code Playgroud)

我怎么做?

python dataframe pandas

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

在 Pandas 中的数据帧中迭代行:使用 df.index 和 df.iterrows() 作为迭代器之间有区别吗?

在 Pandas 中迭代数据帧中的行时,使用以下方法在性能上是否存在差异:

for index in df.index:
    ....
Run Code Online (Sandbox Code Playgroud)

和:

for index, row in df.iterrows():
    ....
Run Code Online (Sandbox Code Playgroud)

?应该优先选择哪一个?

python dataframe pandas

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