gpt4 book ai didi

python - 检测 DataFrame 中某些列中的重复项并对这些列执行操作

转载 作者:太空宇宙 更新时间:2023-11-03 15:33:01 24 4
gpt4 key购买 nike

根据这个问题,这是我想要的输入/输出。我有一些想法,但不完全确定..

How do i detect duplicates and then among them cross check if two columns have similar values?

所以我有一个像这样的数据框。

 No  fname        sname        landline        address     time_of_move_in
1 Alphred Thomas 123 A 19/10/2016,00:01:00
2 Peter Jay 345 B 29/10/2016,00:01:00
3 Donald Hook 123 A 30/10/2016,00:11:00
4 Jay Donald 345 B 29/10/2016,00:05:00
5 Jay Donald 123 A 30/10/2016,00:14:00
6 Haskell Peter 123 B 19/10/2016,00:01:00

我想要的是这样的输出

 Case_Number   fname    sname    landline   address   time_diff
1 Peter Jay 345 B -4 Hours
1 Jay Donald 345 B 4 Hours
2 Donald Hook 123 A -2 Hours
2 Jay Donald 123 A 2 Hours

最终我只想过滤掉发现的两个时间差< 3小时的任何情况。

检测到的任意两个案例之间的标准

  1. 固定电话和地址应相同

  2. 如果上述情况成立,则检测到的两行之间的 fname 或 surname 中必须重复相同的名称。 (在上面的情况 1 中,它是 Jay,在上面的情况 2 中,它是 Donald。请注意,如果 Donald 在 fname 中重复两次,那么这不是一个有效的情况)

  3. 两个时间差 <3 小时,我希望最终在这里引入时间的方向性,从而导致上面输出集中的负值。

注意:我们不必以上述格式显示时差。只要是某种数字/时间格式就可以了

最佳答案

您可以将 timedelta 转换为 total_seconds 因为使用 timedelta < 0 有点复杂:

df.time_of_move_in = pd.to_datetime(df.time_of_move_in, format='%d/%m/%Y,%H:%M:%S')
print (df)
No fname sname landline address time_of_move_in
0 1 Alphred Thomas 123 A 2016-10-19 00:01:00
1 2 Peter Jay 345 B 2016-10-29 00:01:00
2 3 Donald Hook 123 A 2016-10-30 00:11:00
3 4 Jay Donald 345 B 2016-10-29 00:05:00
4 5 Jay Donald 123 A 2016-10-30 00:14:00
5 6 Haskell Peter 123 B 2016-10-19 00:01:00

def f(x):
#convert 4 hours to seconds
hours4 = 4 * 60 * 60
mask = x.fname.isin(x.sname) | x.sname.isin(x.fname) & (len(x) > 1)
x1 = x[mask]
#create unique values from x.name, insert as first column
x1.insert(0,'Case_number', '{}{}'.format(*x.name))
#get difference of datetimes, first value is NaN
x1['time_diff'] = x1.time_of_move_in.diff().dt.total_seconds()
#get inverse difference, last value is NaN so filna NaN by value
x1['time_diff']=x1['time_diff'].fillna(x1.time_of_move_in.diff(-1).dt.total_seconds())
#boolean indexing
x1 = x1[(x1['time_diff'] < hours4) & (x1['time_diff'] > -hours4)]
return x1


df2 = df.groupby(['landline','address']).apply(f).reset_index(drop=True)
#factorize values, add 1 for start from 1
df2.Case_number = pd.factorize(df2.Case_number)[0] + 1
df2.drop(['time_of_move_in', 'No'], axis=1, inplace=True)
print (df2)
Case_number fname sname landline address time_diff
0 1 Donald Hook 123 A -180.0
1 1 Jay Donald 123 A 180.0
2 2 Peter Jay 345 B -240.0
3 2 Jay Donald 345 B 240.0

关于python - 检测 DataFrame 中某些列中的重复项并对这些列执行操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42759117/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com