示例代码在这里
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)
我试图比较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) 关于何时应该使用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速度要快得多?
我有一个数据框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在列表理解中?
我在这里寻找一个解决方案,要么选择其中的行id为idlist,或标志为1,其中排id在idlist。结果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) 问题:让我们从 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)
“中位数”是我的价值,但没有任何变化“就地=真”没有帮助。
非常感谢!
假设我有四个连续排列的列作为数据框的一部分,并且我想用另一个值(假设为 -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) 我想从 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) 我正在尝试迭代包含近一百万个条目的 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) 我想在 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)
我怎么做?
在 Pandas 中迭代数据帧中的行时,使用以下方法在性能上是否存在差异:
for index in df.index:
....
Run Code Online (Sandbox Code Playgroud)
和:
for index, row in df.iterrows():
....
Run Code Online (Sandbox Code Playgroud)
?应该优先选择哪一个?