Pandas | 通过PUBG数据集进行数据分析并理解函数使用

PUBG数据分析

PUBG数据集

train 数据分析

python 复制代码
# 数据量很大  读取需要时间
train = pd.read_csv('Data/train_V2.csv')
test = pd.read_csv('Data/test_V2.csv')

winPlacePerc 列是标签列 查看是否缺失 若是缺失 删除该行数据

python 复制代码
train[train['winPlacePerc'].isnull()]

删除缺失值,并查看

python 复制代码
train.drop(2744604,inplace=True)
train[train['winPlacePerc'].isnull()]

iloc和loc

在上一步骤中train.drop(2744604,inplace=True)代码在源train中删除了这行数据【inplace参数的作用】,

python 复制代码
train.index[2744603],train.index[2744604],train.index[2744605]

(2744603, 2744605, 2744606)

此时查看2744604索引对应的数值 其实发生了变化 这是理解iloc和loc区别的关键从2744604往后的索引都发生了变化

python 复制代码
train.loc[train.index[2744604],:]  # 基于索引  选择


python 复制代码
train.iloc[train.index[2744604],5]  #  基于实际的行数值 选择  即第2744605 行

167.2

.iloc[] 是基于整数位置的索引器,它接受行和列的整数位置作为输入。当你使用 .iloc[] 时,是基于行和列的数值位置 来选择数据的,而不是基于行和列的标签。对应的实际的行数

.loc[] 是基于标签的索引器,它接受行和列的标签作为输入。当你使用 .loc[] 时,你是基于行和列的标签来选择数据的。------对应的'索引'位置

如下图:红色字体是实际的数值位置,而黑色是标签位置也可以理解为索引位置


过滤参数人数少的比赛

matchId 表示同一场比赛

python 复制代码
train.Id.duplicated().sum()  

0

参赛人员没有重复值

duplicated()

python 复制代码
len(train.matchId.unique()) 

47964

python 复制代码
train.groupby('matchId')['matchId'].count()
python 复制代码
train['playersJoin'] = train.groupby('matchId')['matchId'].transform('count')

这将返回一个与 train DataFrame 行数相同长度的Series,其中每个值代表相应 matchId 的出现次数。


.count() 和 transform('count')

弄清两个函数的区别的前提 针对该问题:计算每场比赛的参赛人数 目的是创建新的一列Series并在后面加入人数

在Pandas中,groupby 方法用于对数据进行分组,而 transform 和 count 是对分组后的数据进行操作的两种不同方法。

transform 方法将 groupby 操作应用到指定的列上,并返回与原始数据相同长度的序列。在这种情况下,'count' 聚合函数计算每个组中非NA/null值的数量,然后将这个计数应用到每个组内的每个元素上。

python 复制代码
import pandas as pd

# 创建示例 DataFrame
data = {
    'matchId': [1, 1, 2, 2, 3, 3, 3],
    'otherColumn': ['A', 'B', 'C', 'D', 'E', 'F', 'G']
}
train = pd.DataFrame(data)

# 使用 transform('count') 和 count()
transform_count = train.groupby('matchId')['matchId'].transform('count')
count_result = train.groupby('matchId')['matchId'].count()

print("Transform Count:")
print(transform_count)

print("\nCount Result:")
print(count_result)

Transform Count:

0 2

1 2

2 2

3 2

4 3

5 3

6 3

Name: matchId, dtype: int64

Count Result:

matchId

1 2

2 2

3 3

Name: matchId, dtype: int64

效果一样吗 ?

不,transform('count')count() 的效果不一样,它们在用法和返回结果上有明显的区别:

  1. groupby(...).transform('count'):

    • 这个方法返回的是一个与原始 DataFrame 行数相同长度的 Series
    • 每个元素的值代表相应组在指定列上的非空值数量。
    • 结果 Series 的索引与原始 DataFrame 的索引相同。
    • 可以保留原始数据的顺序和结构。
  2. groupby(...).count():

    • 这个方法返回的是一个新的 DataFrame,只包含每个组的计数。
    • 行数等于唯一分组键的数量,列数为1(或多个,如果对多列进行计数)。
    • 结果中的每一行代表一个唯一的分组键,列中的值表示该键在组中出现的次数。
    • 不保留原始数据的顺序和结构,只提供分组键的计数。

因此,如果你的目标是将每个组的大小附加到原始 DataFrame 的每一行,使用 transform('count')。如果你只需要知道每个组的大小,并且不需要保留原始数据的其他信息,那么使用 count() 就足够了。

例如,假设你有一个包含重复 matchIdDataFrame,并且你想要知道每个 matchId 出现的次数:

使用 transform('count') 会得到:

    matchId  count
0        1      3
1        1      3
2        2      2
3        2      2
4        3      3
5        3      3
6        3      3

这里,count 列显示了每个 matchId 在原始 DataFrame 中出现的次数。

使用 count() 会得到:

   matchId
1        3
2        2
3        3

这里,每一行代表一个唯一的 matchId,并且显示了该 matchId 在原始 DataFrame 中出现的次数。


countplot绘图函数

python 复制代码
# 使用countplot函数必须指明  x还是y
plt.figure(figsize=(20,6))
sns.countplot(x=train[train['playersJoin'] >= 75]['playersJoin']) # 美剧参赛人数》75  认为这场比赛有价值
plt.show()


Python数据可视化-seaborn库之countplot


补充:查看判断pd的某一列是否没有重复值

需求:在过滤参数人数少的比赛我很疑惑是否有同一个人参加不同的比赛呢?而我的理想输出结果就是一个值 :

传统的count() sum() 无法直接进行这种统计,因此:

在Pandas中,你可以使用几种不同的方法来判断一个DataFrame的某一列是否没有重复值。以下是两种常用的方法:

方法 1: 使用 duplicated() 方法

duplicated() 方法可以标记出重复的行。如果一个列没有重复值,那么这个方法返回的布尔序列中应该没有任何 True 值。

python 复制代码
import pandas as pd

# 创建一个示例 DataFrame
df = pd.DataFrame({
    'A': [1, 2, 3, 4, 5],
    'B': [1, 1, 3, 4, 5]
})

# 检查列 'A' 是否有重复值
has_no_duplicates = df['A'].duplicated().any()

print('Column A has no duplicates:', not has_no_duplicates)

如果 has_no_duplicatesFalse,那么列 A 没有重复值。

方法 2: 使用 nunique() 方法

在Pandas中,nunique() 函数用于返回Series或DataFrame中唯一值的数量。当你想要快速了解某个列中有多少个不同的值时,这个函数非常有用。

python 复制代码
train.Id.nunique() == train.shape[0]

nunique() 方法返回一个列中唯一值的数量。如果这个数量等于列的长度,那么说明列中没有重复值。

python 复制代码
# 检查列 'A' 是否有重复值
has_no_duplicates = df['A'].nunique() == len(df['A'])

print('Column A has no duplicates:', has_no_duplicates)

如果输出结果为 True,则列 A 没有重复值。

方法 3: 使用 value_counts() 方法

python 复制代码
train.Id.value_counts().max() == 1

value_counts() 方法返回一个系列,其中包含每个唯一值出现的次数。如果列中没有重复值,那么这个系列的最大值应该为1。

python 复制代码
# 检查列 'A' 是否有重复值
has_no_duplicates = (df['A'].value_counts().max() == 1)

print('Column A has no duplicates:', has_no_duplicates)

如果输出结果为 True,则列 A 没有重复值。

以上方法都可以有效地判断Pandas DataFrame中某一列是否没有重复值。你可以根据你的具体需求和数据的大小选择最适合的方法。

相关推荐
菜鸟的人工智能之路12 小时前
ROC 曲线:医学研究中的得力助手
python·数据分析·健康医疗
迷路爸爸18015 小时前
深入理解Allan方差:用体重数据分析误差的时间尺度与稳定性
机器学习·数据分析·概率论
有Li1 天前
结合无监督表示学习与伪标签监督的自蒸馏方法,用于稀有疾病影像表型分类的分散感知失衡校正|文献速递-基于生成模型的数据增强与疾病监测应用
学习·分类·数据挖掘
人生の三重奏1 天前
pandas——数据结构
人工智能·数据挖掘·pandas
Python当打之年1 天前
【51 Pandas+Pyecharts | 深圳市共享单车数据分析可视化】
信息可视化·数据分析·pandas
Mercury Random1 天前
Loess 局部权重回归
数据挖掘·回归·kotlin
sp_fyf_20242 天前
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-27
人工智能·深度学习·算法·机器学习·语言模型·自然语言处理·数据挖掘
小白熊_XBX2 天前
机器学习实战——基于粒子群优化算法(PSO)优化支持向量回归(SVR)模型(附完整代码)
人工智能·算法·机器学习·分类·数据挖掘·回归·sklearn
AI研习星球2 天前
数据分析-38-关于互联网企业黑名单的探索
深度学习·机器学习·计算机视觉·数据挖掘·数据分析·论文辅导·算法辅导
淘源码d2 天前
Spring Cloud +UniApp智慧工地源码,智慧工地综合解决方案,建筑工程云平台源码
大数据·人工智能·spring cloud·信息可视化·数据分析·源码·智慧工地