[英]Row wise operation on Pandas dataframe
我想遍历数据框并在新列“ Minor-1 ”中分配值,其中每个值都满足某些条件。
输入数据 :
import pandas as pd
data = {'Major' : ['A112','A112','B113','B113','B113','C114','C114','C114','C114'],'Minor' : ['X','Y','X','Y','Z','X','Y','Y','Z']}
df=pd.DataFrame(data)
期望的输出:
{'Major': {0: 'A112', 1: 'A112', 2: 'B113', 3: 'B113', 4: 'B113', 5: 'C114', 6: 'C114', 7: 'C114', 8: 'C114'},'Minor': {0: 'X', 1: 'Y', 2: 'X', 3: 'Y', 4: 'Z', 5: 'X', 6: 'Y', 7: 'Y', 8: 'Z'},'Minor-1': {0: 'Start', 1: 'X', 2: 'Start', 3: 'X', 4: 'Y', 5: 'Start', 6: 'X', 7: 'X', 8: 'Y'}}
我目前使用的代码:
df["Minor-1"]="Start"
for i in range(1,len(df)):
if df['Major'][i]==df.loc[i-1,'Major']:
if df['Minor'][i]!=df.loc[i-1,'Minor'] :
df.loc[i,"Minor-1"]=df['Minor'][i-1]
else:
df.loc[i,"Minor-1"]=df.loc[i-1,"Minor-1"]
目前我正在使用 for 循环来做这件事,我知道这根本没有时间效率。 执行此操作的最快方法是什么? 我检查了iterrows和np.select但无法弄清楚如何使用这些方法获得所需的输出。
这是另一个建议:
df["Minor-1"] = df["Minor"].shift()
df.loc[df["Minor"] == df["Minor"].shift(), "Minor-1"] = None
df.loc[df["Major"] != df["Major"].shift(), "Minor-1"] = "Start"
df["Minor-1"] = df["Minor-1"].ffill()
移位列Minor
用作新列Minor-1
的基础。 然后通过以下方式调整新列:
Minor
中的值与前一个值相同的位置设置为None
:为.ffill()
应用程序做准备。Major
列中值开关的位置填充有"Start"
。.ffill()
填补了空白。我用更大的数据框做了一些性能测量:
from timeit import timeit
def test_1(df):
df["Minor-1"] = "Start"
for i in range(1, len(df)):
if df['Major'][i]==df.loc[i-1,'Major']:
if df['Minor'][i]!=df.loc[i-1,'Minor'] :
df.loc[i,"Minor-1"]=df['Minor'][i-1]
else:
df.loc[i,"Minor-1"]=df.loc[i-1,"Minor-1"]
def test_2(df):
df["Minor-1"] = df["Minor"].shift()
df.loc[df["Minor"] == df["Minor"].shift(), "Minor-1"] = None
df.loc[df["Major"] != df["Major"].shift(), "Minor-1"] = "Start"
df["Minor-1"] = df["Minor-1"].ffill()
data = {
'Major' : ['A112', 'A112', 'B113', 'B113','B113', 'C114', 'C114', 'C114', 'C114'],
'Minor' : ['X', 'Y', 'X', 'Y', 'Z', 'X', 'Y', 'Y', 'Z']
}
df = pd.DataFrame(df)
df = pd.concat(df for _ in range(100)).reset_index(drop=True)
t1 = timeit("test_1(df)", globals=globals(), number=100)
t2 = timeit("test_2(df)", globals=globals(), number=100)
print(t1, t2)
结果: t1 = 37.15364322599635
和t2 = 0.5278295389944105
这对我来说似乎是一个很大的进步。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.