可以把series的值调换位置吗?
有一个series<bound method Series.info of 2 2065
11 1120
12 1044
14 970
13 908
98 898
16 652
17 519
Name: 数量, dtype: int64>
可以把它的两个值调换过来吗?换成这样
<bound method Series.info of 2065 2
1120 11
1044 12
970 14
908 13
898 98
652 16
519 17
Name: 数量, dtype: int64>
该怎么写代码,用什么函数来调换它们的位置。
麻烦大家给个主意,谢谢 本帖最后由 isdkz 于 2023-2-4 10:42 编辑
import pandas as pd
s = pd.Series()
print("转换前:")
print(s.info)
print()
#转换的代码,实现原理是修改 pandas 用于格式化输出的源码把 fmt_index 和 fmt_values 调换,执行后永久生效,你可以看代码的实现过程,后面可以自己改回来
import fileinput
for line in fileinput.input(pd.io.formats.format.__file__, backup='.bak', inplace=1):
if line != ' result = self.adj.adjoin(3, *, fmt_values])\n':
print(line, end='')
else:
print(' result = self.adj.adjoin(3, *])')
pd.io.formats.format.__spec__.loader.load_module()
print("转换后:")
print(s.info)
效果:
转换前:
<bound method Series.info of 0 2065
1 1120
2 1044
3 970
4 908
5 898
6 652
7 519
dtype: int64>
转换后:
<bound method Series.info of2065 0
1120 1
1044 2
970 3
908 4
898 5
652 6
519 7
dtype: int64> 应该在导入的时候就分清index和data isdkz 发表于 2023-2-4 10:26
效果:
按您的代码,试运行下,运行后出现
转换前:
<bound method Series.info of 0 2065
1 1120
2 1044
3 970
4 908
5 898
6 652
7 519
dtype: int64>
Traceback (most recent call last):
File "C:\Users\Administrator\Desktop\Scripts\转换位置.py", line 9, in <module>
for line in fileinput.input(pd.io.formats.format.__file__, backup='.bak', inplace=1):
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python311\Lib\fileinput.py", line 251, in __next__
line = self._readline()
^^^^^^^^^^^^^^^^
UnicodeDecodeError: 'gbk' codec can't decode byte 0x9d in position 2907: illegal multibyte sequence
进程已结束,退出代码1
请问下,该如何解决? 本帖最后由 isdkz 于 2023-2-4 11:20 编辑
skyhouse 发表于 2023-2-4 11:14
按您的代码,试运行下,运行后出现
转换前:
编码问题:加个参数encoding指定编码
修改后的代码:
import pandas as pd
s = pd.Series()
print("转换前:")
print(s.info)
print()
#转换的代码,实现原理是修改 pandas 用于格式化输出的源码把 fmt_index 和 fmt_values 调换,执行后永久生效,你可以看代码的实现过程,后面可以自己改回来
import fileinput
for line in fileinput.input(pd.io.formats.format.__file__, backup='.bak', inplace=1, encoding='utf-8'):
if line != ' result = self.adj.adjoin(3, *, fmt_values])\n':
print(line, end='')
else:
print(' result = self.adj.adjoin(3, *])')
pd.io.formats.format.__spec__.loader.load_module()
print("转换后:")
print(s.info) isdkz 发表于 2023-2-4 11:18
编码问题:加个参数encoding指定编码
修改后的代码:
请问怎么改回来格式化输出的源码,我执行其他py文件会报错。
刚刚重装了python跟pycharm,还是会报错。 本帖最后由 isdkz 于 2023-2-4 12:04 编辑
skyhouse 发表于 2023-2-4 11:58
请问怎么改回来格式化输出的源码,我执行其他py文件会报错。
刚刚重装了python跟pycharm,还是会报错。
会报错可能是因为你的pandas跟我的pandas版本不一致,所以代码也有点不一样
C:\Users\Administrator\AppData\Local\Programs\Python\Python311\Lib\site-packages\pandas\io\formats\format.py
你把这个文件第 409 行(包括第 409 行前后的)内容复制出来给我看看
或者把报错信息放上来
isdkz 发表于 2023-2-4 12:03
会报错可能是因为你的pandas跟我的pandas版本不一致,所以代码也有点不一样
C:%users\Administrator ...
format文件 399行开始
if self.is_truncated_vertically:
n_header_rows = 0
row_num = self.tr_row_num
row_num = cast(int, row_num)
width = self.adj.len(fmt_values)
if width > 3:
dot_str = "..."
else:
dot_str = ".."
# Series uses mode=center because it has single value columns
# DataFrame uses mode=left
dot_str = self.adj.justify(, width, mode="center")
fmt_values.insert(row_num + n_header_rows, dot_str)
fmt_index.insert(row_num + 1, "")
if self.index:
result = self.adj.adjoin(3, *])
else:
result = self.adj.adjoin(3, fmt_values)
if self.header and have_header:
result = fmt_index + "\n" + result
if footer:
result += "\n" + footer
return str("".join(result))
报错信息是:
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python311\Lib\site-packages\pandas\__init__.py", line 48, in <module>
from pandas.core.api import (
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python311\Lib\site-packages\pandas\core\api.py", line 47, in <module>
from pandas.core.groupby import (
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python311\Lib\site-packages\pandas\core\groupby\__init__.py", line 1, in <module>
from pandas.core.groupby.generic import (
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python311\Lib\site-packages\pandas\core\groupby\generic.py", line 76, in <module>
from pandas.core.frame import DataFrame
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python311\Lib\site-packages\pandas\core\frame.py", line 171, in <module>
from pandas.core.generic import NDFrame
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python311\Lib\site-packages\pandas\core\generic.py", line 147, in <module>
from pandas.core.describe import describe_ndframe
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python311\Lib\site-packages\pandas\core\describe.py", line 45, in <module>
from pandas.io.formats.format import format_percentiles
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python311\Lib\site-packages\pandas\io\formats\format.py", line 991
^
IndentationError: expected an indented block after 'if' statement on line 990
isdkz 发表于 2023-2-4 12:03
会报错可能是因为你的pandas跟我的pandas版本不一致,所以代码也有点不一样
C:%users\Administrator ...
刚刚发现format文件有个备份,在你刚刚的程序中有备份bak,改下后缀能用。 skyhouse 发表于 2023-2-4 12:42
format文件 399行开始
if self.is_truncated_vertically:
n_header_rows = 0
我之前的代码有做个备份的,你把
C:\Users\Administrator\AppData\Local\Programs\Python\Python311\Lib\site-packages\pandas\io\formats\format.py 删掉
C:\Users\Administrator\AppData\Local\Programs\Python\Python311\Lib\site-packages\pandas\io\formats\format.py.bak 这个文件的 .bak 去掉
然后你想把索引显示在右边的话就改下面标红的那一句,我就是把 fmt_values 和 fmt_index 的位置做了调换,你后面要改回来的话可以调换回来
format文件 399行开始
if self.is_truncated_vertically:
n_header_rows = 0
row_num = self.tr_row_num
row_num = cast(int, row_num)
width = self.adj.len(fmt_values)
if width > 3:
dot_str = "..."
else:
dot_str = ".."
# Series uses mode=center because it has single value columns
# DataFrame uses mode=left
dot_str = self.adj.justify(, width, mode="center")
fmt_values.insert(row_num + n_header_rows, dot_str)
fmt_index.insert(row_num + 1, "")
if self.index:
result = self.adj.adjoin(3, *], fmt_values) # 这一句改成 result = self.adj.adjoin(3, *])
else:
result = self.adj.adjoin(3, fmt_values)
if self.header and have_header:
result = fmt_index + "\n" + result
if footer:
result += "\n" + footer
return str("".join(result))
isdkz 发表于 2023-2-4 12:03
会报错可能是因为你的pandas跟我的pandas版本不一致,所以代码也有点不一样
C:%users\Administrator ...
这个方法比较伤筋动骨,有没其他方法?运行效率慢点也能接受。 本帖最后由 isdkz 于 2023-2-4 15:34 编辑
skyhouse 发表于 2023-2-4 12:51
这个方法比较伤筋动骨,有没其他方法?运行效率慢点也能接受。
暂时没有发现其它方法,那个改源码也就改一个地方而已,我就是怕你不会改才写了个代码的,
没想到那个代码跟你的 pandas 不通用 isdkz 发表于 2023-2-4 12:53
暂时没有发现其它方法,那个改源码也就改一个地方而已,我就是怕你不会改才写了个代码的,
没想带那个 ...
谢谢你,我静等其他大神给解决方法 import pandas as pd
data =
index =
s = pd.Series(data, index=index)
print(s)
s2 = pd.Series(s.index, index=s.values)
print(s2)
这种数据和index应该是在导入时解决的问题,不应该交给pandas. suchocolate 发表于 2023-2-4 15:37
这种数据和index应该是在导入时解决的问题,不应该交给pandas.
他的意思大概是想把索引显示在右边,而不是把索引和数据调换 isdkz 发表于 2023-2-4 16:51
他的意思大概是想把索引显示在右边,而不是把索引和数据调换
好吧 谢谢各位的回答,感谢。
页:
[1]