搜索

查看: 3134|回复: 11

[Python] Pandas.DataFrame行和列的转置的实现

[复制链接]
发表于 2023-5-4 17:23:02 | 显示全部楼层 |阅读模式
Editor 2023-5-4 17:23:02 3134 11 看全部
目录
  • pandas.DataFrame.T
  • pandas.DataFrame.transpose()
  • 修改原始对象本身
  • 当进行类型转换(广播)时
  • 视图和复制如果要交换(转置)pandas.DataFrame的行和列,使用T属性或transpose()方法。
    这两种方法都不会保留原始对象不变,也不会返回交换了行和列(转置)的新对象。请注意,根据每一列的数据类型dtype,将生成视图而不是副本,并且更改原始对象和转置对象之一的值将更改另一个视图。

    pandas.DataFrame.T
    可以使用T属性获得转置的pandas.DataFrame。
    import pandas as pd
    df = pd.DataFrame({'X': [0, 1, 2], 'Y': [3, 4, 5]}, index=['A', 'B', 'C'])
    print(df)
    #    X  Y
    # A  0  3
    # B  1  4
    # C  2  5
    print(df.T)
    #    A  B  C
    # X  0  1  2
    # Y  3  4  5
    pandas.DataFrame.transpose()
    transpose()方法类似。
    print(df.transpose())
    #    A  B  C
    # X  0  1  2
    # Y  3  4  5

    修改原始对象本身
    没有像inplace这样的参数可以修改原始对象本身。如果不想创建新对象,只需将其分配给原始对象本身即可。
    df = df.T
    print(df)
    #    A  B  C
    # X  0  1  2
    # Y  3  4  5

    当进行类型转换(广播)时
    为pandas.DataFrame中的每一列设置数据类型dtype。
    如果所有列都具有相同的数据类型,则即使通过T或transpose()进行转置,该数据类型也将保持相同。
    df = pd.DataFrame({'X': [0, 1, 2], 'Y': [3, 4, 5]}, index=['A', 'B', 'C'])
    print(df)
    #    X  Y
    # A  0  3
    # B  1  4
    # C  2  5
    print(df.dtypes)
    # X    int64
    # Y    int64
    # dtype: object
    print(df.T)
    #    A  B  C
    # X  0  1  2
    # Y  3  4  5
    print(df.T.dtypes)
    # A    int64
    # B    int64
    # C    int64
    # dtype: object
    如果每一列都有不同的数据类型,则执行类型转换(广播)。例如,如果作为转置的结果生成了其中混合了整数int和浮点数float的列,则该列的数据类型变为float。
    df_mix = pd.DataFrame({'col_int': [0, 1, 2], 'col_float': [0.1, 0.2, 0.3]}, index=['A', 'B', 'C'])
    print(df_mix)
    #    col_int  col_float
    # A        0        0.1
    # B        1        0.2
    # C        2        0.3
    print(df_mix.dtypes)
    # col_int        int64
    # col_float    float64
    # dtype: object
    print(df_mix.T)
    #              A    B    C
    # col_int    0.0  1.0  2.0
    # col_float  0.1  0.2  0.3
    print(df_mix.T.dtypes)
    # A    float64
    # B    float64
    # C    float64
    # dtype: object
    即使再次转置它也无法还原。需要应用astype()来转换数据类型。

    print(df_mix.T.T)
    #    col_int  col_float
    # A      0.0        0.1
    # B      1.0        0.2
    # C      2.0        0.3
    print(df_mix.T.T.dtypes)
    # col_int      float64
    # col_float    float64
    # dtype: object
    元素为字符串str的字符串是对象类型。
    df_mix2 = pd.DataFrame({'col_int': [0, 1, 2], 'col_float': [0.1, 0.2, 0.3], 'col_str': ['a', 'b', 'c']},
                           index=['A', 'B', 'C'])
    print(df_mix2)
    #    col_int  col_float col_str
    # A        0        0.1       a
    # B        1        0.2       b
    # C        2        0.3       c
    print(df_mix2.dtypes)
    # col_int        int64
    # col_float    float64
    # col_str       object
    # dtype: object
    print(df_mix2.T)
    #              A    B    C
    # col_int      0    1    2
    # col_float  0.1  0.2  0.3
    # col_str      a    b    c
    print(df_mix2.T.dtypes)
    # A    object
    # B    object
    # C    object
    # dtype: object
    print(df_mix2.T.T)
    #   col_int col_float col_str
    # A       0       0.1       a
    # B       1       0.2       b
    # C       2       0.3       c
    print(df_mix2.T.T.dtypes)
    # col_int      object
    # col_float    object
    # col_str      object
    # dtype: object
    视图和复制
    如果所有列都具有相同的数据类型,则T或transpose()将返回视图。
    原始对象和视图对象共享内存,因此更改一个元素会更改另一个元素。
    df = pd.DataFrame({'X': [0, 1, 2], 'Y': [3, 4, 5]}, index=['A', 'B', 'C'])
    print(df)
    #    X  Y
    # A  0  3
    # B  1  4
    # C  2  5
    df_T = df.T
    print(df_T)
    #    A  B  C
    # X  0  1  2
    # Y  3  4  5
    df_transpose = df.transpose()
    print(df_transpose)
    #    A  B  C
    # X  0  1  2
    # Y  3  4  5
    df.at['A', 'X'] = 100
    print(df)
    #      X  Y
    # A  100  3
    # B    1  4
    # C    2  5
    print(df_T)
    #      A  B  C
    # X  100  1  2
    # Y    3  4  5
    print(df_transpose)
    #      A  B  C
    # X  100  1  2
    # Y    3  4  5
    如果每一列的数据类型dtype不同,则T或transpose()将生成一个副本。转置的对象保留一个新的存储区,因此,如果更改一个的值,则另一个将保持不变。
    df_mix = pd.DataFrame({'col_int': [0, 1, 2], 'col_float': [0.1, 0.2, 0.3]}, index=['A', 'B', 'C'])
    print(df_mix)
    #    col_int  col_float
    # A        0        0.1
    # B        1        0.2
    # C        2        0.3
    df_mix_T = df_mix.T
    print(df_mix_T)
    #              A    B    C
    # col_int    0.0  1.0  2.0
    # col_float  0.1  0.2  0.3
    df_mix_transpose = df_mix.transpose()
    print(df_mix_transpose)
    #              A    B    C
    # col_int    0.0  1.0  2.0
    # col_float  0.1  0.2  0.3
    df_mix.at['A', 'col_int'] = 100
    print(df_mix)
    #    col_int  col_float
    # A      100        0.1
    # B        1        0.2
    # C        2        0.3
    print(df_mix_T)
    #              A    B    C
    # col_int    0.0  1.0  2.0
    # col_float  0.1  0.2  0.3
    print(df_mix_transpose)
    #              A    B    C
    # col_int    0.0  1.0  2.0
    # col_float  0.1  0.2  0.3
    如果仅在后续过程中使用转置的转置,则不必担心。以显式创建副本。在transpose()中,当参数copy设置为True时,将生成一个副本。
    df = pd.DataFrame({'X': [0, 1, 2], 'Y': [3, 4, 5]}, index=['A', 'B', 'C'])
    print(df)
    #    X  Y
    # A  0  3
    # B  1  4
    # C  2  5
    df_T_copy = df.T.copy()
    print(df_T_copy)
    #    A  B  C
    # X  0  1  2
    # Y  3  4  5
    df_transpose_copy = df.transpose(copy=True)
    print(df_transpose_copy)
    #    A  B  C
    # X  0  1  2
    # Y  3  4  5
    df.at['A', 'X'] = 100
    print(df)
    #      X  Y
    # A  100  3
    # B    1  4
    # C    2  5
    print(df_T_copy)
    #    A  B  C
    # X  0  1  2
    # Y  3  4  5
    print(df_transpose_copy)
    #    A  B  C
    # X  0  1  2
    # Y  3  4  5
    transpose()的参数副本默认为False,如果可能,则生成视图而不是副本。如上例所示,当每列的数据类型dtype不同时,即使它是默认值(copy = False),也会生成一个副本。不一定是视图。
    到此这篇关于Pandas.DataFrame行和列的转置的实现的文章就介绍到这了,更多相关Pandas.DataFrame行列转置内容请搜索知鸟论坛以前的文章或继续浏览下面的相关文章希望大家以后多多支持知鸟论坛
  • 回复

    使用道具 举报

    发表于 2023-6-28 19:20:02 | 显示全部楼层
    123456819 2023-6-28 19:20:02 看全部
    既然你诚信诚意的推荐了,那我就勉为其难的看看吧!知鸟论坛不走平凡路。
    回复

    使用道具 举报

    发表于 2023-6-29 03:08:12 | 显示全部楼层
    惜颜705 2023-6-29 03:08:12 看全部
    感谢楼主的无私分享!要想知鸟论坛好 就靠你我他
    回复

    使用道具 举报

    发表于 2023-6-29 19:53:35 | 显示全部楼层
    六翼天使494 2023-6-29 19:53:35 看全部
    楼主,我太崇拜你了!我想我是一天也不能离开知鸟论坛
    回复

    使用道具 举报

    发表于 2023-6-30 01:26:14 | 显示全部楼层
    掌舵的鱼1987 2023-6-30 01:26:14 看全部
    楼主,我太崇拜你了!我想我是一天也不能离开知鸟论坛
    回复

    使用道具 举报

    发表于 2023-6-30 20:41:44 | 显示全部楼层
    心随674 2023-6-30 20:41:44 看全部
    这个帖子不回对不起自己!我想我是一天也不能离开知鸟论坛
    回复

    使用道具 举报

    发表于 2023-7-1 00:15:18 | 显示全部楼层
    我是的十八簿 2023-7-1 00:15:18 看全部
    楼主,大恩不言谢了!知鸟论坛是最棒的!
    回复

    使用道具 举报

    发表于 2023-7-3 12:23:57 | 显示全部楼层
    普通人物怨 2023-7-3 12:23:57 看全部
    楼主,我太崇拜你了!我想我是一天也不能离开知鸟论坛
    回复

    使用道具 举报

    发表于 2023-7-3 21:34:03 | 显示全部楼层
    永远就三年疗 2023-7-3 21:34:03 看全部
    楼主,我太崇拜你了!我想我是一天也不能离开知鸟论坛
    回复

    使用道具 举报

    发表于 2023-7-4 03:12:25 | 显示全部楼层
    xinting_6ym 2023-7-4 03:12:25 看全部
    这个帖子不回对不起自己!我想我是一天也不能离开知鸟论坛
    回复

    使用道具 举报

    • 您可能感兴趣
    点击右侧快捷回复 【请勿灌水】
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则 返回列表

    RSS订阅| SiteMap| 小黑屋| 知鸟论坛
    联系邮箱E-mail:zniao@foxmail.com
    快速回复 返回顶部 返回列表