目录
376、pandas.Series.list.flatten方法
377、pandas.Series.list.__getitem__魔法方法
378、pandas.Series.struct.field方法
379、pandas.Series.struct.explode方法
一、用法精讲
376、pandas.Series.list.flatten方法
376-1、语法
# 376、pandas.Series.list.flatten方法
pandas.Series.list.flatten()
Flatten list values.
Returns:
pandas.Series
The data from all lists in the series flattened.
376-2、参数
无
376-3、功能
将嵌套的列表或数组结构扁平化,即将多层嵌套的列表转换为一维列表,这对于处理复杂的数据结构非常有用,特别是在数据分析和清洗过程中,可以更直观地分析数据。
376-4、返回值
返回一个新的列表,它是原始嵌套列表的扁平化版本,返回的列表包含原始列表中所有的元素,但不再具有任何嵌套结构。
376-5、说明
使用场景:
376-5-1、数据清理:在数据集中,有时我们可能需要清理包含嵌套列表的列,通过扁平化这些列表,可以更容易地分析和处理数据。例如,处理用户的购物车内容,将每个购物车中的商品合并到一个单一列表中,以便于后续分析。
376-5-2、数据汇总:当你需要对嵌套列表中的数据进行汇总时,扁平化可以大大简化这一过程。例如,可以从多个用户的反馈中提取出所有的关键字,并将它们汇总到一个列表中,以便后续进行频率分析或情感分析。
376-5-3、特征工程:在机器学习和深度学习中,特征工程是数据预处理的重要步骤,如果你的数据集中包含了列表形式的特征(例如,一个用户的观看记录),可以使用flatten()方法将这些嵌套特征扁平化,从而将其转化为模型可以接受的一维格式。
376-5-4、数据可视化准备:在准备可视化数据时,尤其是绘制图表或进行统计分析时,扁平化的数据结构更易于使用。例如,在制作条形图或者饼图时,确保数据是一维的可以减少处理的复杂性。
376-5-5、处理JSON或API数据:在使用API获取数据时,返回的结果往往包含嵌套结构(例如,嵌套的JSON对象),使用该方法可以帮助快速处理并提取出需要的信息,使得进一步的数据分析或存储工作更加高效。
376-5-6、数据整合与合并:当从多个来源收集数据时,有些数据可能会以不同的嵌套方式存储,通过扁平化这些列表,可以得到一致的数据格式,从而便于后续合并或整合。
376-6、用法
376-6-1、数据准备
无
376-6-2、代码示例
# 376、pandas.Series.list.flatten方法
# 376-1、数据清理
import pandas as pd
# 构造数据
data = {
'user_id': [1, 2, 3],
'shopping_cart': [['item1', 'item2'], ['item3'], ['item4', 'item5', 'item6']]
}
df = pd.DataFrame(data)
# 扁平化购物车
flattened_cart = df.explode('shopping_cart')
print(flattened_cart, end='\n\n')
# 376-2、数据汇总
import pandas as pd
# 构造数据
data = {
'user_id': [1, 2, 3],
'feedback': [['great', 'satisfaction'], ['okay'], ['great', 'good', 'excellent']]
}
df = pd.DataFrame(data)
# 扁平化反馈
flattened_feedback = df.explode('feedback')
# 汇总关键词
keyword_counts = flattened_feedback['feedback'].value_counts()
print(keyword_counts, end='\n\n')
# 376-3、特征工程
import pandas as pd
# 构造数据
data = {
'user_id': [1, 2, 3],
'watch_history': [['Movie A', 'Movie B'], ['Movie C'], ['Movie A', 'Movie D']]
}
df = pd.DataFrame(data)
# 扁平化观看历史
flattened_watch_history = df.explode('watch_history')
# 准备特征(这里简单以独热编码的形式展示)
features = pd.get_dummies(flattened_watch_history['watch_history'])
print(features, end='\n\n')
# 376-4、数据可视化准备
import pandas as pd
import matplotlib.pyplot as plt
# 构造数据
data = {
'user_id': [1, 2, 3],
'watch_history': [['Movie A', 'Movie B'], ['Movie C'], ['Movie A', 'Movie D', 'Movie E']]
}
df = pd.DataFrame(data)
# 扁平化观看历史
flattened_watch_history = df.explode('watch_history')
# 统计每部电影的观看次数
watch_counts = flattened_watch_history['watch_history'].value_counts()
# 可视化
watch_counts.plot(kind='bar', color='purple')
plt.title('Movie Watch Counts')
plt.xlabel('Movies')
plt.xticks(rotation=25, ha='right', color='#FF4444', fontweight='bold')
plt.ylabel('Counts')
plt.show()
# 376-5、处理JSON或API数据
import pandas as pd
# 模拟从API获取的数据,包含嵌套结构
data = [
{'user_id': 1, 'purchases': ['item1', 'item2']},
{'user_id': 2, 'purchases': ['item3']},
{'user_id': 3, 'purchases': ['item4', 'item5', 'item6']}
]
# 转换为DataFrame
df = pd.DataFrame(data)
# 扁平化购买记录
flattened_purchases = df.explode('purchases')
print(flattened_purchases, end='\n\n')
# 376-6、数据整合与合并
import pandas as pd
# 源1的数据
data1 = {
'user_id': [1, 2],
'items': [['item1', 'item2'], ['item3']]
}
# 源2的数据
data2 = {
'user_id': [2, 3],
'items': [['item4'], ['item5', 'item6']]
}
df1 = pd.DataFrame(data1)
df2 = pd.DataFrame(data2)
# 扁平化
df1_flat = df1.explode('items')
df2_flat = df2.explode('items')
# 合并数据
merged_df = pd.concat([df1_flat, df2_flat], ignore_index=True)
print(merged_df)
376-6-3、结果输出
# 376、pandas.Series.list.flatten方法
# 376-1、数据清理
# user_id shopping_cart
# 0 1 item1
# 0 1 item2
# 1 2 item3
# 2 3 item4
# 2 3 item5
# 2 3 item6
# 376-2、数据汇总
# feedback
# great 2
# satisfaction 1
# okay 1
# good 1
# excellent 1
# Name: count, dtype: int64
# 376-3、特征工程
# Movie A Movie B Movie C Movie D
# 0 True False False False
# 0 False True False False
# 1 False False True False
# 2 True False False False
# 2 False False False True
# 376-4、数据可视化准备
# 见图1
# 376-5、处理JSON或API数据
# user_id purchases
# 0 1 item1
# 0 1 item2
# 1 2 item3
# 2 3 item4
# 2 3 item5
# 2 3 item6
# 376-6、数据整合与合并
# user_id items
# 0 1 item1
# 1 1 item2
# 2 2 item3
# 3 2 item4
# 4 3 item5
# 5 3 item6
图1:
377、pandas.Series.list.__getitem__魔法方法
377-1、语法
# 377、pandas.Series.list.__getitem__魔法方法
pandas.Series.list.__getitem__(key)
Index or slice lists in the Series.
Parameters:
key
int | slice
Index or slice of indices to access from each list.
Returns:
pandas.Series
The list at requested index.
377-2、参数
377-2-1、key(必须):具体来说,key可以是以下几种类型:
377-2-1-1、单个整数:如果你提供一个单整数key(如0,1等),它将返回Series中该位置上的元素,这是通过位置索引来获取的。
377-2-1-2、切片对象:如果提供一个切片对象(如slice(0,3),它将返回对应范围内的元素组成的列表。
377-2-1-3、布尔数组:如果提供一个布尔数组(如[True, False, True]
),它将返回所有对应为True的位置上的元素。
377-2-1-4、列表或数组:如果提供一个包含多个索引的列表或数组(如[1, 3]
),它将返回对应位置的元素组成的新列表。
377-3、功能
在于根据输入的key访问Series中的元素,它允许用户灵活地访问单个元素或多个元素,并返回相应的结果。
377-4、返回值
- 如果key是单个整数,返回该位置上的元素(通常是一个值或列表)。
- 如果key是切片,返回一个新列表,包含在切片范围内的所有元素。
- 如果key是布尔数组,则返回对应为True的元素组成的新列表。
- 如果key是一个列表或数组,则返回对应位置的元素组成的新列表。
377-5、说明
使用场景:
377-5-1、数据提取:当你需要从时间序列、分类数据或其他类型的序列中提取特定值时,该方法非常有用,你可以使用索引提取初始化数据,方便后续分析。
377-5-2、数据过滤:利用布尔索引提取符合特定条件的元素。例如,你可以根据某些逻辑条件来选择数据,这在数据清洗和预处理时非常常见。
377-5-3、批量操作:通过传递列表或数组作为索引,可以一次性提取多个元素。例如,当你只想分析某些特定日期的数据时,可以通过列表索引快速提取这些数据。
377-5-4、切片操作:通过切片对象提取一段连续的数据。这适用于需要处理一段时间序列(如金融数据)或一组相关指标的情况,例如计算某个时间段的平均值或总和。
377-5-5、动态索引访问:在数据分析过程中,可能会基于用户交互、算法输出或其他动态条件调整需要访问的元素,该方法可以灵活实现这种动态访问。
377-5-6、数据转换:在处理复杂数据时,可以借助该方法提取并转换数据格式。例如,将数据从列表转换为数组格式或提取特定列的数据进行后续处理。
377-6、用法
377-6-1、数据准备
无
377-6-2、代码示例
# 377、pandas.Series.list.__getitem__魔法方法
# 377-1、数据提取
import pandas as pd
# 创建一个数据序列
s = pd.Series([10, 20, 30, 40])
# 提取索引为2的值
value = s[2]
print(f"提取的值: {value}", end='\n\n')
# 377-2、数据过滤
import pandas as pd
# 创建一个数据序列
s = pd.Series([1, 2, 3, 4, 5])
# 提取大于3的元素
filtered = s[s > 3]
print(f"过滤后的数据: {filtered.tolist()}", end='\n\n')
# 377-3、批量操作
import pandas as pd
# 创建一个数据序列
s = pd.Series(['a', 'b', 'c', 'd'])
# 提取索引为0和2的元素
subset = s[[0, 2]]
print(f"提取的子集: {subset.tolist()}", end='\n\n')
# 377-4、切片操作
import pandas as pd
# 创建一个数据序列
s = pd.Series([1, 2, 3, 4, 5])
# 切片操作
slice_result = s[1:4]
print(f"切片结果: {slice_result.tolist()}", end='\n\n')
# 377-5、动态索引访问
import pandas as pd
# 创建一个数据序列
s = pd.Series(['apple', 'banana', 'cherry', 'date'])
# 假设我们有一个动态索引列表
dynamic_indices = [1, 3]
# 根据动态索引提取数据
dynamic_result = s[dynamic_indices]
print(f"动态提取的结果: {dynamic_result.tolist()}", end='\n\n')
# 377-6、数据转换
import pandas as pd
# 创建一个数据序列
s = pd.Series([10, 20, 30, 40])
# 提取数据并转换为NumPy数组
array_result = s.to_numpy()
print(f"转换为数组: {array_result}")
377-6-3、结果输出
# 377、pandas.Series.list.__getitem__魔法方法
# 377-1、数据提取
# 提取的值: 30
# 377-2、数据过滤
# 过滤后的数据: [4, 5]
# 377-3、批量操作
# 提取的子集: ['a', 'c']
# 377-4、切片操作
# 切片结果: [2, 3, 4]
# 377-5、动态索引访问
# 动态提取的结果: ['banana', 'date']
# 377-6、数据转换
# 转换为数组: [10 20 30 40]
378、pandas.Series.struct.field方法
378-1、语法
# 378、pandas.Series.struct.field方法
pandas.Series.struct.field(name_or_index)
Extract a child field of a struct as a Series.
Parameters:
name_or_indexstr | bytes | int | expression | list
Name or index of the child field to extract.
For list-like inputs, this will index into a nested struct.
Returns:
pandas.Series
The data corresponding to the selected child field.
378-2、参数
378-2-1、name_or_index(必须):该参数可以是字符串或整数,具体取决于你想要访问的字段的名称或索引,如果是字符串,表示你想获取的字段的名称;如果是整数,表示字段的位置索引(从0开始)。
378-3、功能
用于访问Series中每个元素的特定字段,方便对结构化数据进行处理和分析,它通常与包含多个字段的复杂数据结构结合使用,比如从Series中提取某个字段的信息。
378-4、返回值
返回一个Series对象,其中包含从原始Series中选定字段提取的值,如果字段不存在,通常会引发错误,提示无法找到指定的字段。
378-5、说明
无
378-6、用法
378-6-1、数据准备
无
378-6-2、代码示例
# 378、pandas.Series.struct.field方法
import pyarrow as pa
import pandas as pd
import pyarrow.compute as pc
s = pd.Series(
[
{"version": 1, "project": "pandas"},
{"version": 2, "project": "pandas"},
{"version": 1, "project": "numpy"},
],
dtype=pd.ArrowDtype(pa.struct(
[("version", pa.int64()), ("project", pa.string())]
))
)
data_by_name = s.struct.field("project")
print(data_by_name)
data_by_index = s.struct.field(0)
print(data_by_index)
data = s.struct.field(pc.field("project"))
print(data)
378-6-3、结果输出
# 378、pandas.Series.struct.field方法
# 0 pandas
# 1 pandas
# 2 numpy
# Name: project, dtype: string[pyarrow]
# 0 1
# 1 2
# 2 1
# Name: version, dtype: int64[pyarrow]
# 0 pandas
# 1 pandas
# 2 numpy
# Name: project, dtype: string[pyarrow]
379、pandas.Series.struct.explode方法
379-1、语法
# 379、pandas.Series.struct.explode方法
pandas.Series.struct.explode()
Extract all child fields of a struct as a DataFrame.
Returns:
pandas.DataFrame
The data corresponding to all child fields.
379-2、参数
无
379-3、功能
返回一个新的DataFrame或Series,其中列表或数组的每个元素都在单独的一行中。
379-4、返回值
对于DataFrame,返回一个新的DataFrame,其中原来包含列表的列被“展开”为多行;对于Series,返回一个新的Series,播放同样的效果。
379-5、说明
无
379-6、用法
379-6-1、数据准备
无
379-6-2、代码示例
# 379、pandas.Series.struct.explode方法
import pandas as pd
data = {
'id': [1, 2, 3],
'fruits': [['apple', 'banana'], ['orange'], ['grape', 'kiwi']]
}
df = pd.DataFrame(data)
exploded_df = df.explode('fruits')
print(exploded_df)
379-6-3、结果输出
# 379、pandas.Series.struct.explode方法
# id fruits
# 0 1 apple
# 0 1 banana
# 1 2 orange
# 2 3 grape
# 2 3 kiwi
380、pandas.Flags类
380-1、语法
# 380、pandas.Flags类
class pandas.Flags(obj, *, allows_duplicate_labels)
Flags that apply to pandas objects.
Parameters:
objSeries or DataFrame
The object these flags are associated with.
allows_duplicate_labelsbool, default True
Whether to allow duplicate labels in this object. By default, duplicate labels are permitted. Setting this to False will cause an errors.DuplicateLabelError to be raised when index (or columns for DataFrame) is not unique, or any subsequent operation on introduces duplicates. See Disallowing Duplicate Labels for more.
Warning
This is an experimental feature. Currently, many methods fail to propagate the allows_duplicate_labels value. In future versions it is expected that every method taking or returning one or more DataFrame or Series objects will propagate allows_duplicate_labels.
380-2、参数
380-2-1、obj(必须):需要设置Flags的对象,它指明了要应用Flags的目标对象。
380-2-2、allows_duplicate_labels(可选,默认值为False):表示是否允许在对象中存在重复的标签,默认值为False,表示不允许重复标签;如果设置为True,则对象可以有重复的标签。
380-3、功能
用于定义DataFrame或Series中的标签的属性,该类可以帮助用户指定对某些操作的行为,比如是否允许重复标签。
380-4、返回值
返回一个Flags对象,表示所提供对象的标签属性,这可以用于后续的数据操作以确保所应用标志的有效性和一致性。
380-5、说明
380-5-1、使用Flags设置的属性通常会影响到后续的操作,所以在创建DataFrame或Series之后,理解这些标志的作用是非常重要的。
380-5-2、标签的重复与否可以影响到数据分析和处理的结果,因此在创建或操作对象时需谨慎考虑这些设置。
380-6、用法
380-6-1、数据准备
无
380-6-2、代码示例
# 380、pandas.Flags类
import pandas as pd
# 创建一个DataFrame
df = pd.DataFrame({
'A': [1, 2, 3],
'B': [4, 5, 6]
})
# 设置Flags,允许重复标签
flags = pd.Flags(df, allows_duplicate_labels=True)
# 检查Flags属性
print(flags.allows_duplicate_labels)
380-6-3、结果输出
# 380、pandas.Flags类
# True