我试图根据Column D
中的地点连续返回每个项目。
目前我通过df = df.loc[df['D'] == '#specific place']
这样做。
这样可以正常工作,但如果我有50个不同的地方,这个代码会变得非常低效。我必须改变df = df.loc[df['D'] == '#another specific place']
50次。如果地方保持不变但每个数据集包含不同的地方,我会这样做。
是否有更有效的方法来返回每个地方的行?我在每个地方都有一个单独的df
,我可以返回list
。我可以使用此列表中的值来返回
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
答案 0 :(得分:0)
您可以通过循环显示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
现在你有一个填满想要结果的词典
答案 1 :(得分:0)
您只需要一个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