Pandas 100道练习题(二)

2020-09-27  本文已影响0人  butters001

Pandas 100道练习题(二)

题目逐渐变难(态)

DataFrames: beyond the basics

难度:中等

  1. 数据去重
# 数据
df = pd.DataFrame({'A': [1, 2, 2, 3, 4, 5, 5, 5, 6, 7, 7]})
# 答案
df.drop_duplicates(subset='A')
22.png
  1. 每个元素减去所在行的平均值
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
  1. 哪一列数字的总和最小?返回该列的标签
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
  1. 计算一个DataFrame有多少唯一行(即忽略所有重复的行)
df = pd.DataFrame(np.random.randint(0, 2, size=(10, 3)))
len(df.drop_duplicates())
  1. 已知每行中恰好有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
  1. 对于每个组(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
  1. 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
上一篇下一篇

猜你喜欢

热点阅读