繁体   English   中英

Pandas 数据帧上的逐行操作

[英]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 循环来做这件事,我知道这根本没有时间效率。 执行此操作的最快方法是什么? 我检查了iterrowsnp.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.15364322599635t2 = 0.5278295389944105这对我来说似乎是一个很大的进步。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM