Pandas 100道练习题(二)
题目逐渐变难(态)
DataFrames: beyond the basics
难度:中等
- 数据去重
# 数据
df = pd.DataFrame({'A': [1, 2, 2, 3, 4, 5, 5, 5, 6, 7, 7]})
# 答案
df.drop_duplicates(subset='A')
22.png
- 每个元素减去所在行的平均值
df = pd.DataFrame(np.random.random(size=(5, 3)))
df.sub(df.mean(axis=1), axis=0)
# 1. 首先获取每行的平均值
rows_mean = df.mean(axis=1)
# 2. 然后执行减法操作
df.sub(rows_mean, axis=0)
23.png
- 哪一列数字的总和最小?返回该列的标签
df = pd.DataFrame(np.random.random(size=(5, 10)), columns=list('abcdefghij'))
df.sum().idxmin()
# 1. 首先计算每一列的和
columns_sum = df.sum()
# 2. 求和最小值的标签
columns_sum.idxmin()
24.png
- 计算一个DataFrame有多少唯一行(即忽略所有重复的行)
df = pd.DataFrame(np.random.randint(0, 2, size=(10, 3)))
len(df.drop_duplicates())
- 已知每行中恰好有5个NaN值。对每行查找,找到第三个是NaN的列标签
返回结果如:[e,c,d,h,d]
nan = np.nan
data = [[0.04, nan, nan, 0.25, nan, 0.43, 0.71, 0.51, nan, nan],
[ nan, nan, nan, 0.04, 0.76, nan, nan, 0.67, 0.76, 0.16],
[ nan, nan, 0.5 , nan, 0.31, 0.4 , nan, nan, 0.24, 0.01],
[0.49, nan, nan, 0.62, 0.73, 0.26, 0.85, nan, nan, nan],
[ nan, nan, 0.41, nan, 0.05, nan, 0.61, nan, 0.48, 0.68]]
columns = list('abcdefghij')
df = pd.DataFrame(data, columns=columns)
(df.isnull().cumsum(axis=1)==3).idxmax(axis=1)
# 1. 将nan换成True,非nan换成False
temp = df.isnull()
# 2. 每行找第三个nan,就是找每行累加和是3时候的最小列索引
sum_3 = temp.cumsum(axis=1)==3
# 3. 找到每行第一个为True的值
sum_3.idxmax(axis=1)
26.png
- 对于每个组(a组,b组,c组),找到三个数相加的最大和
df = pd.DataFrame({'grps': list('aaabbcaabcccbbc'),
'vals': [12,345,3,1,45,14,4,52,54,23,235,21,57,3,87]})
df.groupby('grps')['vals'].apply(lambda x: x.nlargest(3)).sum(level=0)
# 1. 先分组
group = df.groupby('grps')
# 2. 对每一组的vals分别取出3个最大值
largest_3 = group['vals'].apply(lambda x: x.nlargest(3))
# 3. largest_3是个MultiIndex的Series,对第一层索引(a,b,c)分别求和,指定level层级
largest_3.sum(level=0)
27.png
- df数据如下,A和B都是0-100之间的数值,对A进行分段分组,求每组内B的和
# df数据
df = pd.DataFrame(np.random.RandomState(8765).randint(1, 101, size=(100, 2)), columns = ["A", "B"])
A B
0 46 29
1 75 22
2 49 63
3 33 43
4 71 75
.. .. ..
95 60 87
96 57 40
97 86 19
98 50 56
99 97 94
# 结果类似如下
A
(0, 10] 635
(10, 20] 360
(20, 30] 315
(30, 40] 306
(40, 50] 750
(50, 60] 284
(60, 70] 424
(70, 80] 526
(80, 90] 835
(90, 100] 852
df.groupby(pd.cut(df['A'], bins=range(0, 101, 10)))['B'].sum()
# 1. 对A进行分段,可以用range(0, 101, 10)代替np.arange(0, 101, 10)
cut_a = pd.cut(df['A'], np.arange(0, 101, 10))
# 2. 按cut_a进行分组,再对每组的B进行求和
df.groupby(cut_a)['B'].sum()
28.png
网友评论