此工作表的长度为150 000个条目,共有五列。在特定的列中,有许多重复的条目。列名是“ CNumber”。条目如下:
123
334
233
123
224
..依此类推。我想生成一个视图,以便对于特定的CNumber(例如123),我想标识第一个条目及其最后一个条目。
含义: 有一栏显示“时间”。因此,在特定的一天中,假设CNumber“ 123”使用了12次,因此在工作表中输入了12次。但是我只想确定它的第一次使用和最后一次使用,以便我可以计算出特定日期在公司场所的使用时间。
答案 0 :(得分:2)
熊猫解决方案:
#create DataFrame from file
df = pd.read_csv(file)
print(df)
CNumber Time
0 123 1
1 334 2
2 123 3
3 123 4
4 224 5
按boolean indexing
过滤:
a = 123
df1 = df[df['CNumber'] == a]
print (df1)
CNumber Time
0 123 1
2 123 3
3 123 4
通过使用iloc
索引位置来获取过滤后的列Time
的第一个和最后一个值:
first = df1['Time'].iloc[0]
last = df1['Time'].iloc[-1]
print ('For value {} is first time: {} and last time: {}'.format(a, first, last))
For value 123 is first time: 1 and last time: 4
如果需要为所有第一个和最后一个值生成数据帧(如果像224
列这样的唯一值相同)
df2 = df.groupby('CNumber')['Time'].agg(['first','last'])
print (df2)
first last
CNumber
123 1 4
224 5 5
334 2 2
但是可能只过滤重复的值:
df3=df[df['CNumber'].duplicated(keep=False)].groupby('CNumber')['Time'].agg(['first','last'])
print (df3)
first last
CNumber
123 1 4
答案 1 :(得分:0)
考虑时间,“第一”和“最后”具有双重含义。它可以表示“数据集中的最后一个”或“最后一个时间”。
以下代码使用group by一次处理所有CNumber
,并显示了两种解释之间的区别。
import pandas as pd
df = pd.DataFrame(columns=["CNumber", "Time"]
, data=[
[123, 4],
[321, 3],
[123, 1],
[789, 5],
[123, 6],
[123, 2],
[321, 0]
])
print(df, end='\n\n')
groups = df.groupby(['CNumber'])
print("Maximal time")
print(groups.max(), end='\n\n')
print("Last occurrence")
for group in groups:
print('For CNumber {}, last occurence is {}'
.format(group[0], group[1]['Time'].iloc[-1]))
这将产生以下输出:
CNumber Time
0 123 4
1 321 3
2 123 1
3 789 5
4 123 6
5 123 2
6 321 0
Maximal time
Time
CNumber
123 6
321 3
789 5
Last occurrence
For CNumber 123, last occurence is 2
For CNumber 321, last occurence is 0
For CNumber 789, last occurence is 5