Pandas.DataFrame行和列如何转置

其他教程   发布日期:2023年06月26日   浏览次数:303

本篇内容主要讲解“Pandas.DataFrame行和列如何转置”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Pandas.DataFrame行和列如何转置”吧!

如果要交换(转置)pandas.DataFrame的行和列,使用T属性或transpose()方法。

这两种方法都不会保留原始对象不变,也不会返回交换了行和列(转置)的新对象。请注意,根据每一列的数据类型dtype,将生成视图而不是副本,并且更改原始对象和转置对象之一的值将更改另一个视图。

pandas.DataFrame.T

可以使用T属性获得转置的pandas.DataFrame。

  1. import pandas as pd
  2. df = pd.DataFrame({'X': [0, 1, 2], 'Y': [3, 4, 5]}, index=['A', 'B', 'C'])
  3. print(df)
  4. # X Y
  5. # A 0 3
  6. # B 1 4
  7. # C 2 5
  8. print(df.T)
  9. # A B C
  10. # X 0 1 2
  11. # Y 3 4 5

pandas.DataFrame.transpose()

transpose()方法类似。

  1. print(df.transpose())
  2. # A B C
  3. # X 0 1 2
  4. # Y 3 4 5

修改原始对象本身

没有像inplace这样的参数可以修改原始对象本身。如果不想创建新对象,只需将其分配给原始对象本身即可。

  1. df = df.T
  2. print(df)
  3. # A B C
  4. # X 0 1 2
  5. # Y 3 4 5

当进行类型转换(广播)时

为pandas.DataFrame中的每一列设置数据类型dtype。

如果所有列都具有相同的数据类型,则即使通过T或transpose()进行转置,该数据类型也将保持相同。

  1. df = pd.DataFrame({'X': [0, 1, 2], 'Y': [3, 4, 5]}, index=['A', 'B', 'C'])
  2. print(df)
  3. # X Y
  4. # A 0 3
  5. # B 1 4
  6. # C 2 5
  7. print(df.dtypes)
  8. # X int64
  9. # Y int64
  10. # dtype: object
  11. print(df.T)
  12. # A B C
  13. # X 0 1 2
  14. # Y 3 4 5
  15. print(df.T.dtypes)
  16. # A int64
  17. # B int64
  18. # C int64
  19. # dtype: object

如果每一列都有不同的数据类型,则执行类型转换(广播)。例如,如果作为转置的结果生成了其中混合了整数int和浮点数float的列,则该列的数据类型变为float。

  1. df_mix = pd.DataFrame({'col_int': [0, 1, 2], 'col_float': [0.1, 0.2, 0.3]}, index=['A', 'B', 'C'])
  2. print(df_mix)
  3. # col_int col_float
  4. # A 0 0.1
  5. # B 1 0.2
  6. # C 2 0.3
  7. print(df_mix.dtypes)
  8. # col_int int64
  9. # col_float float64
  10. # dtype: object
  11. print(df_mix.T)
  12. # A B C
  13. # col_int 0.0 1.0 2.0
  14. # col_float 0.1 0.2 0.3
  15. print(df_mix.T.dtypes)
  16. # A float64
  17. # B float64
  18. # C float64
  19. # dtype: object

即使再次转置它也无法还原。需要应用astype()来转换数据类型。

  1. print(df_mix.T.T)
  2. # col_int col_float
  3. # A 0.0 0.1
  4. # B 1.0 0.2
  5. # C 2.0 0.3
  6. print(df_mix.T.T.dtypes)
  7. # col_int float64
  8. # col_float float64
  9. # dtype: object

元素为字符串str的字符串是对象类型。

  1. df_mix2 = pd.DataFrame({'col_int': [0, 1, 2], 'col_float': [0.1, 0.2, 0.3], 'col_str': ['a', 'b', 'c']},
  2. index=['A', 'B', 'C'])
  3. print(df_mix2)
  4. # col_int col_float col_str
  5. # A 0 0.1 a
  6. # B 1 0.2 b
  7. # C 2 0.3 c
  8. print(df_mix2.dtypes)
  9. # col_int int64
  10. # col_float float64
  11. # col_str object
  12. # dtype: object
  13. print(df_mix2.T)
  14. # A B C
  15. # col_int 0 1 2
  16. # col_float 0.1 0.2 0.3
  17. # col_str a b c
  18. print(df_mix2.T.dtypes)
  19. # A object
  20. # B object
  21. # C object
  22. # dtype: object
  23. print(df_mix2.T.T)
  24. # col_int col_float col_str
  25. # A 0 0.1 a
  26. # B 1 0.2 b
  27. # C 2 0.3 c
  28. print(df_mix2.T.T.dtypes)
  29. # col_int object
  30. # col_float object
  31. # col_str object
  32. # dtype: object

视图和复制

如果所有列都具有相同的数据类型,则T或transpose()将返回视图。

原始对象和视图对象共享内存,因此更改一个元素会更改另一个元素。

  1. df = pd.DataFrame({'X': [0, 1, 2], 'Y': [3, 4, 5]}, index=['A', 'B', 'C'])
  2. print(df)
  3. # X Y
  4. # A 0 3
  5. # B 1 4
  6. # C 2 5
  7. df_T = df.T
  8. print(df_T)
  9. # A B C
  10. # X 0 1 2
  11. # Y 3 4 5
  12. df_transpose = df.transpose()
  13. print(df_transpose)
  14. # A B C
  15. # X 0 1 2
  16. # Y 3 4 5
  17. df.at['A', 'X'] = 100
  18. print(df)
  19. # X Y
  20. # A 100 3
  21. # B 1 4
  22. # C 2 5
  23. print(df_T)
  24. # A B C
  25. # X 100 1 2
  26. # Y 3 4 5
  27. print(df_transpose)
  28. # A B C
  29. # X 100 1 2
  30. # Y 3 4 5

如果每一列的数据类型dtype不同,则T或transpose()将生成一个副本。转置的对象保留一个新的存储区,因此,如果更改一个的值,则另一个将保持不变。

  1. df_mix = pd.DataFrame({'col_int': [0, 1, 2], 'col_float': [0.1, 0.2, 0.3]}, index=['A', 'B', 'C'])
  2. print(df_mix)
  3. # col_int col_float
  4. # A 0 0.1
  5. # B 1 0.2
  6. # C 2 0.3
  7. df_mix_T = df_mix.T
  8. print(df_mix_T)
  9. # A B C
  10. # col_int 0.0 1.0 2.0
  11. # col_float 0.1 0.2 0.3
  12. df_mix_transpose = df_mix.transpose()
  13. print(df_mix_transpose)
  14. # A B C
  15. # col_int 0.0 1.0 2.0
  16. # col_float 0.1 0.2 0.3
  17. df_mix.at['A', 'col_int'] = 100
  18. print(df_mix)
  19. # col_int col_float
  20. # A 100 0.1
  21. # B 1 0.2
  22. # C 2 0.3
  23. print(df_mix_T)
  24. # A B C
  25. # col_int 0.0 1.0 2.0
  26. # col_float 0.1 0.2 0.3
  27. print(df_mix_transpose)
  28. # A B C
  29. # col_int 0.0 1.0 2.0
  30. # col_float 0.1 0.2 0.3

如果仅在后续过程中使用转置的转置,则不必担心。以显式创建副本。在transpose()中,当参数copy设置为True时,将生成一个副本。

  1. df = pd.DataFrame({'X': [0, 1, 2], 'Y': [3, 4, 5]}, index=['A', 'B', 'C'])
  2. print(df)
  3. # X Y
  4. # A 0 3
  5. # B 1 4
  6. # C 2 5
  7. df_T_copy = df.T.copy()
  8. print(df_T_copy)
  9. # A B C
  10. # X 0 1 2
  11. # Y 3 4 5
  12. df_transpose_copy = df.transpose(copy=True)
  13. print(df_transpose_copy)
  14. # A B C
  15. # X 0 1 2
  16. # Y 3 4 5
  17. df.at['A', 'X'] = 100
  18. print(df)
  19. # X Y
  20. # A 100 3
  21. # B 1 4
  22. # C 2 5
  23. print(df_T_copy)
  24. # A B C
  25. # X 0 1 2
  26. # Y 3 4 5
  27. print(df_transpose_copy)
  28. # A B C
  29. # X 0 1 2
  30. # Y 3 4 5

transpose()的参数副本默认为False,如果可能,则生成视图而不是副本。如上例所示,当每列的数据类型dtype不同时,即使它是默认值(copy = False),也会生成一个副本。不一定是视图。

以上就是Pandas.DataFrame行和列如何转置的详细内容,更多关于Pandas.DataFrame行和列如何转置的资料请关注九品源码其它相关文章!