Python 高效地返回数据集中的特定行

Python 高效地返回数据集中的特定行,python,pandas,loops,Python,Pandas,Loops,我试图根据列D中的位置返回一行中的每个项目 目前,我正在通过df=df.loc[df['D']='#specific place'].执行此操作 这很好,但如果我有50个不同的地方,这段代码会变得非常低效。我必须更改df=df.loc[df['D']=='#另一个特定位置]50次。如果位置保持不变,但每个数据集包含不同的位置,我会这样做 是否有更有效的方法返回每个位置的行?我有一个单独的df,每个地方都有一个列表。我可以使用此列表中的值返回中的函数吗 import pandas as pd p

我试图根据
列D
中的位置返回一行中的每个项目

目前,我正在通过
df=df.loc[df['D']='#specific place'].
执行此操作

这很好,但如果我有50个不同的地方,这段代码会变得非常低效。我必须更改
df=df.loc[df['D']=='#另一个特定位置]
50次。如果位置保持不变,但每个数据集包含不同的位置,我会这样做

是否有更有效的方法返回每个位置的行?我有一个单独的
df
,每个地方都有一个
列表
。我可以使用此列表中的值返回中的函数吗

import pandas as pd

places = ['Home','Away','Shops']

d = ({
    'C' : ['08:00:00','XX','08:10:00','XX','08:41:42','XX','08:50:00','XX', '09:00:00', 'XX','09:15:00','XX','09:21:00','XX','09:30:00','XX','09:40:00','XX'],
    'D' : ['Home','','Home','','Away','','Shops','','Away','','Shops','','Home','','Away','','Home',''],
    'E' : ['Num:','','Num:','','Num:','','Num:','','Num:', '','Num:','','Num:','','Num:', '','Num:', ''],
    'F' : ['1','','1','','1','','1','','1', '','2','','2','','1', '','2',''],   
    'A' : ['A','','A','','A','','A','','A','','A','','A','','A','','A',''],           
    'B' : ['Stop','','Res','','Stop','','Start','','Res','','Stop','','Res','','Start','','Start','']
    })

df = pd.DataFrame(data=d)

#Select desired place
Home = df.loc[df['D'] == 'Home']
Shops = df.loc[df['D'] == 'Shops']
Away = df.loc[df['D'] == 'Away']
预期产出:

    A      B         C     D     E  F
0   A   Stop  08:00:00  Home  Num:  1
2   A    Res  08:10:00  Home  Num:  1
12  A    Res  09:21:00  Home  Num:  2
16  A  Start  09:40:00  Home  Num:  2
6   A  Start  08:50:00  Shops  Num:  1
10  A   Stop  09:15:00  Shops  Num:  2
4   A   Stop  08:41:42  Away  Num:  1
8   A    Res  09:00:00  Away  Num:  1
14  A  Start  09:30:00  Away  Num:  1

例如,您可以通过循环df['B']来识别位置,识别非空字符串并将其保存在列表中

places = []
for i in df['B']:
    if i!="":places.append(i)
###now you can create a dict to save the differences
diff_result = {}
for i in places:
    Stop = df.loc[df['B'] == i].reset_index()['C']
    Start = df.loc[df['B'] == i].reset_index()['C']
    Res = df.loc[df['B'] == i].reset_index()['C']
    diff_result[i+"_diff"] = Res

现在,您有了一个包含所需结果的字典

您所需要的只是一个groupby(),然后可能是列“D”中排除/包含的唯一项的列表:

df = pd.DataFrame(data=d)

df['C'] = pd.to_timedelta(df['C'], errors="coerce").dt.total_seconds()

places = ['Home','Away','Shops']

for d, dfg in df[df['D'].isin(places)].groupby('D'):
    # print out the processing place
    print('group:{}\n{}'.format(d, dfg))
    # do whatever you want on `dfg` and `d`
    # In your example, when d is 'Home', dfg is df.loc[df['D'] == 'Home']
    # below your code, just change `df` to `dfg`
    #Return start-stop times
    Stop = dfg.loc[df['B'] == 'Stop'].reset_index()['C']
    Start = dfg.loc[df['B'] == 'Start'].reset_index()['C']
    Res = dfg.loc[df['B'] == 'Res'].reset_index()['C']

    #return difference
    Start_diff = Start - Stop
    Res_diff = Res - Start

谢谢@jxc。这是怎么回事?它是否
excluded=['Everything Iwant','Undeposed']
。您好,@PeterJames123:
excluded
是列-D中的唯一值列表,您不想将其包含在处理例程中(例如,当D为空时)
df[~df.D.isin(已排除)]
将过滤掉这些行。另一方面,您也可以显式地指定所有50个位置,例如
included=['Home'、'Away'、'Everything Iwant'…]
,然后使用:
df[df.D.isin(included)]。groupby('D'):
(删除
~
,这是按位反转的)我简化了问题@jxc。您的解决方案并没有返回每个位置。如果我有一个空列表,它只返回一个位置。不是allOK,我只是调整了代码,使其包含您刚才添加的位置列表。(
print()
行仅用于调试)。但是,如果D列('Shops')中没有
位置
的记录,它将不会显示在结果中。谢谢@jxc。如果我想在将来的工作中使用该df,我会使用什么输出代码?如果I:=“Home”:places.append(I)