将DataFrame的每一列的(列标题和元素)合并生成tuple
  X5zJxoD00Cah 2023年11月22日 20 0
# 需求: 将DataFrame的每一列的(列标题和元素)合并生成tuple
# 这些tuple被保存于一个list
# 注意: 迭代器(zip, zip_longest, itertuples等)只供一次性消耗
# zip_longest与zip, 在本例效果一致
# *df.itertuples(index=False) 与 *[df.iloc[i] for i in range(df.shape[0])] 效果类似
from itertools import zip_longest
import pandas as pd
df = pd.DataFrame([['11','12'],['21']], columns=['col1', 'col2'], index=['ind1', 'ind2'])
df.index.name = 'ind_name1'
df['ind_name2'] = df.index
df.set_index([df.index, 'ind_name2'], inplace=True)  # 或reset_index再set_index
def myprint(*values, sep='\t', end='\n'*2):
    for value in values:
        print(value, end=sep)
    print(end=end)
    
myprint(df)

print("将DataFrame的(每一列的元素)合并生成tuple")
zipped = zip_longest(*df.itertuples(index=False))
myprint(list(zipped))

print("将DataFrame的每一列的(列标题和元素)合并生成tuple")
zipped = zip_longest(*df.itertuples(index=False))
myprint([(col_name, *row) for col_name, row in zip(df.columns, zipped)])

print("将 DataFrame 的(全部行索引)和(每一列的元素)分别生成tuple")
zipped = zip_longest(*df.itertuples(index=True))
myprint(list(zipped))

print("将 DataFrame 的(每一列的(行索引标题和行索引))和(每一列的(列标题和元素))分别生成tuple")
# zipped = zip_longest(*df.itertuples(index=True))
# myprint([(col_name, *row) for col_name, row in zip(df.columns, zipped)])
# 会错位 (第一列的列标题匹配行索引, ..., 第n列的列标题匹配第n-1列), 漏掉最后一列
zip_value = zip_longest(*df.itertuples(index=False))
list_value = [(col_name, *row) for col_name, row in zip(df.columns, zip_value)]
zip_index = zip_longest(*df.index.to_frame().itertuples(index=False))
list_index = [(col_name, *row) for col_name, row in zip(df.index.names, zip_index)]
myprint(list_index + list_value)
【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月22日 0

暂无评论

推荐阅读
  X5zJxoD00Cah   2023年12月11日   26   0   0 知乎Python迭代器
X5zJxoD00Cah