
本文将介绍如何使用 Pandas 库将具有特定结构的数据框进行转换,把多行多列中符合条件的值提取并合并到单行中。该结构的数据框中,存在成对的位置和名称列,我们的目标是提取位置不为 -1 的名称,并将这些名称合并到一个新的数据框中,形成单行数据。本文将提供详细的代码示例和解释,帮助你理解并应用此方法。
在数据处理中,经常会遇到需要将分散在多行多列的数据合并成单行的情况。例如,当数据以键值对的形式存储在多个列中,而我们希望将这些键值对提取出来并形成一个更紧凑的数据结构时,就可以使用本文介绍的方法。
假设我们有如下的数据框 df (Table A):
Position A Name A Position B Name B Position C Name C Position D Name D Position E Name E 0 -1 tortise -1 monkey 2 coca cola -1 slug -1 rooster 1 3 sprite 2 coffee -1 bird -1 monkey -1 ostrich 2 -1 nope -1 nope -1 fish 5 root beer 1 tea 3 -1 nope -1 nope -1 nope -1 nope -1 nope
我们的目标是创建一个新的数据框 (Table B),其中包含 Name A 到 Name E 列,并且只包含 Position 列中对应值不等于 -1 的 Name 值。预期结果如下:
Name A Name B Name C Name D Name E 0 sprite coffee coca cola root beer tea
以下是使用 Pandas 实现此转换的代码:
多奥淘宝客程序免费版拥有淘宝客站点的基本功能,手动更新少,管理简单等优点,适合刚接触网站的淘客们,或者是兼职做淘客们。同样拥有VIP版的模板引擎技 术、强大的文件缓存机制,但没有VIP版的伪原创跟自定义URL等多项创新的搜索引擎优化技术,除此之外也是一款高效的API数据系统实现无人值守全自动 化运行的淘宝客网站程序。4月3日淘宝联盟重新开放淘宝API申请,新用户也可使用了
import pandas as pd
# 示例数据框 (Table A)
data = {'Position A': [-1, 3, -1, -1],
'Name A': ['tortise', 'sprite', 'nope', 'nope'],
'Position B': [-1, 2, -1, -1],
'Name B': ['monkey', 'coffee', 'nope', 'nope'],
'Position C': [2, -1, -1, -1],
'Name C': ['coca cola', 'bird', 'fish', 'nope'],
'Position D': [-1, -1, 5, -1],
'Name D': ['slug', 'monkey', 'root beer', 'nope'],
'Position E': [-1, -1, 1, -1],
'Name E': ['rooster', 'ostrich', 'tea', 'nope']}
df = pd.DataFrame(data)
# 核心代码
new_df = (df.filter(like='Name').stack()
.where(df.filter(like='Position').stack().ne(-1).values)
.dropna().droplevel(0).sort_index().to_frame().T
)
print(new_df)代码解释:
- df.filter(like='Name'): 使用 filter 函数选择所有列名包含 "Name" 的列,得到只包含 Name 列的数据框。
- .stack(): 使用 stack 函数将选择的 Name 列堆叠成一个 Series。这将把多个列合并成一个长列,方便后续处理。
- .where(df.filter(like='Position').stack().ne(-1).values): 这是关键的一步。首先,我们使用 df.filter(like='Position') 选择所有列名包含 "Position" 的列,然后使用 stack 函数将其堆叠成一个 Series。接着,使用 .ne(-1) 筛选出所有值不等于 -1 的位置。最后,使用 .where() 函数,根据位置信息,只保留 Name 列中对应位置不为 -1 的值,其他值会被替换为 NaN。.values 用来确保索引对齐。
- .dropna(): 使用 dropna 函数删除所有包含 NaN 值的行。这将删除所有位置为 -1 的 Name 值。
- .droplevel(0): 使用 droplevel(0) 函数删除堆叠操作创建的最外层索引,使得 Series 的索引更简洁。
- .sort_index(): 使用 sort_index() 函数对 Series 的索引进行排序,保证输出结果的顺序一致。
- .to_frame().T: 使用 to_frame() 函数将 Series 转换为 DataFrame,然后使用 .T 进行转置,将单列数据转换为单行数据,得到最终的结果。
注意事项:
- 确保 Position 和 Name 列的对应关系正确。代码依赖于它们在数据框中的相对位置。
- 如果 Position 列中的无效值不是 -1,请相应地修改 .ne(-1) 中的值。
- 此方法适用于具有类似结构的数据框,可以灵活地应用于其他数据清洗和转换任务。
总结:
本文提供了一种使用 Pandas 将具有特定结构的数据框进行转换的方法,可以将分散在多行多列中的符合条件的值提取并合并到单行中。通过使用 filter、stack、where、dropna 等函数,可以高效地完成数据转换任务。理解并掌握这些技巧,可以帮助你更好地处理和分析数据。









