【问题标题】:Python Pandas Square Brackets LIST from STRING来自 STRING 的 Python Pandas 方括号列表
【发布时间】:2021-10-11 18:09:08
【问题描述】:

警告:我是 Python、Pandas 和 PySerial 的新手......

我正在使用 Pandas 从 Excel 电子表格中读取值。 Excel 中的值存储为文本,但同时包含字母和数字字符。 see Snip of Excel data

我使用 Pandas 命令 mydata = pd.read_excel (*path etc goes here*) 导入这些 这个函数没有遇到问题)

然后我可以使用print(mydata) ....打印它们,输出看起来与 Excel 电子表格中显示的相同(即,没有额外字符):

0  MW000000007150000300000;

1  MW000100009850000200000;

2  MW000200009860000200000;      #<<<<<<<< *Notice that there are NO square brackets and no extra Quotes*.

要通过 PySerial 函数 serial.write 将这些数据发送到我的 RS-232 链接设备,我正在循环遍历 必须(据我所知......)在 LIST 格式。因此,我使用命令 Allocation_list=mydata.values.tolist()

将数据字段 mydata 转换为 LIST

如果我print(Allocation_list),我发现添加了许多方括号单引号,如您在此处看到的:

Allocation_list =([['MW000000007150000300000;'], ['MW000100009850000200000;'], ['MW000200009860000200000;'], ['MW000300009870000200000;'], ['MW000400009880000200000;'], ['MW000500009890000200000;']])

当我 > 将 LIST 中的值写入我的 RS-232 设备时,这些方括号不会被忽略

事实上,这些值被写成(二进制版本的......)

0 memory written as ['MW000000007150000300000;']

1 memory written as ['MW000100009850000200000;']

2 memory written as ['MW000200009860000200000;']

3 memory written as ['MW000300009870000200000;']

4 memory written as ['MW000400009880000200000;']

5 memory written as ['MW000500009890000200000;']

不幸的是,为了让 RS-232 设备接受写入它的每一行作为可接受的命令,它们必须是该设备的精确命令格式,看起来像

MW000000007150000300000;

因此,必须以某种方式删除方括号和引号。

对于这个特殊问题的任何帮助将不胜感激,因为我已经尝试了其他“线程”中描述的几种方法,但它们似乎都不能正常工作,因为我的数据字段是一组字符串(转换为位仅当它们即将被写入 RS-232 设备时)。 M

【问题讨论】:

  • 看起来您正在转储整个数据框列表。它只是需要进入列表的一列吗?如果是这样,请使用Allocation_list = mydata['OneOfTheColumnNames'].to_list(),其中OneOfTheColumnNames 是数据框中的有效列名。
  • 感谢您的快速回复。事实上,我正在使用 Pandas 从电子表格的一个指定列中读取指定范围的行。所以数据框只有两列(分配给数据的编号在左侧;关注的数据在右侧)
  • 不过,您应该引用一列。找出两种方式的输出差异:ibb.co/n6zfZmd
  • 所以,当我从 Excel 工作表导入数据时,我没有指定列名。使用 pd.read.excel 函数时,我还没有看到分配列名的方法
  • 开始时会比较棘手,但您可以使用mydata.columns[0],因此某些行的列表将是Allocation_list = df.loc[2:4,mydata.columns[0]].to_list()。只需将24 更改为所需的行范围,但请注意索引从0 开始。因此2:4 将获得第 3 到第 5 行。

标签: python pandas list brackets datafield


【解决方案1】:

即使你有一个只有一列的框架,也要避免这种情况:

l = df.values.tolist()
l
#outputs:
[[40], [10], [20], [10], [15], [30]]

为避免此问题,请在输出到列表时包含一列:

l = df['amount'].to_list()
l
#outputs:
[40, 10, 20, 10, 15, 30]

如果您想要一系列行,请使用 loc:

#put rows 3 to 5 (note the index starts at 0!) for only column 'amount' into a list
l = df.loc[2:4,'amount'].to_list()
l
#outputs:
[20, 10, 15]

在只有一列的框架上完整显示代码:

【讨论】:

  • 总结:似乎命令'pd.read_excel'不允许用户为数据分配列名
  • 总结:1) 似乎命令“pd.read_excel”不允许用户为数据分配列名; 2) 可以在执行 pd.read_excel 后为数据框分配列名; 3) 分配看起来像 mydataframe.columns = ['Bob', 'Alice', 'Jim', etc etc] 4) 将名称分配给列后,使用 my_list_name 仅将感兴趣的命名列转换为 LIST =mydataframe['Bob'].to_list() 。这个方法我试过了,效果很好---没有多余的 [ ] 也没有多余的 ' ' ""
【解决方案2】:

首先,values 保留了它被调用的对象的维度,因此您必须针对包含连续序列的确切列,例如mydata["column_label"](只需通过打印数据框检查相关的列标签)。

至于引号,pyserial write() 接受类似bytes 的对象,因此您可能需要使用b'string''string'.encode("utf8") 表示法传递字符串的编码版本。

【讨论】:

    猜你喜欢
    • 2012-02-12
    • 1970-01-01
    • 2021-05-16
    • 2020-11-09
    • 2018-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多