【问题标题】:Converting column value to ascii将列值转换为 ascii
【发布时间】:2021-11-18 17:35:28
【问题描述】:

我有一个带有列的数据框,比如 v1~v4

| _NAME    | _TIMESTAMP          | v0    | v1   | v2    | v3    | v4    |
|----------|---------------------|-------|------|-------|-------|-------|
| BRAKE_LH | 17-11-2021 22:50:43 | 13896 | 8262 | 12339 | 13110 | 13107 |
| BRAKE_LH | 17-11-2021 22:51:34 | 13896 | 8262 | 12339 | 13110 | 13107 |
| BRAKE_LH | 17-11-2021 22:51:35 | 13896 | 8262 | 12339 | 13110 | 13107 |
| BRAKE_LH | 17-11-2021 22:51:36 | 13896 | 8262 | 12339 | 13110 | 13107 |
| BRAKE_LH | 17-11-2021 22:51:37 | 0     | 0    | 0     | 0     | 0     |  

如果我想对列 v1~v4 执行以下功能

df['v0'] = df['v0'].apply(lambda x: chr(round(x / 256)) + chr(x % 256)).apply(lambda x: x[::-1])
df['v1'] = df['v1'].apply(lambda x: chr(round(x / 256)) + chr(x % 256)).apply(lambda x: x[::-1])
df['v2'] = df['v2'].apply(lambda x: chr(round(x / 256)) + chr(x % 256)).apply(lambda x: x[::-1])
df['v3'] = df['v3'].apply(lambda x: chr(round(x / 256)) + chr(x % 256)).apply(lambda x: x[::-1])
df['v4'] = df['v4'].apply(lambda x: chr(round(x / 256)) + chr(x % 256)).apply(lambda x: x[::-1])

在某些情况下,列会超过 4 列,例如 40 或 100 列

有没有一种简单的方法可以将它应用于所有列,除了--> _NAME & _TIMESTAMP 列

【问题讨论】:

  • 以代码形式提供您的输入数据。
  • @hpchavaz:修改
  • 这能回答你的问题吗? How to exclude and filter few columns in pandas?
  • 你可以这样做:for col in df.columns: df[col] = df[col].apply( ...) 提示:如果你定义一个函数并调用它会更干净你的 lambda 表达式
  • 附带说明:看到您的公式有一部分是除以 256,另一部分是使用 % 来除以其余部分。这最常用于使用整数除法的第一部分,即chr(x // 256),而不是舍入x / 256 的结果。看看这是否适用于您的用例。舍入的问题是,当除法结果的小数部分 >= 0.5 时,你会得到一个更大的值。如果你还把余数和这个舍入的值一起取,那就没有意义了。

标签: python pandas ascii


【解决方案1】:

您可以将列_NAME_TIMESTAMP 设置为.set_index() 的索引(以排除它们进行处理)。然后使用.applymap() 使用您的公式对每列进行元素处理。最后将_NAME_TIMESTAMP这两个列恢复为.reset_index()的数据列,如下:

df.set_index(['_NAME', '_TIMESTAMP']).applymap(lambda x: chr(round(x / 256)) + chr(x % 256)).applymap(lambda x: x[::-1]).reset_index()

结果:

      _NAME           _TIMESTAMP  v0  v1  v2  v3  v4
0  BRAKE_LH  17-11-2021 22:50:43  H6  F   30  63  33
1  BRAKE_LH  17-11-2021 22:51:34  H6  F   30  63  33
2  BRAKE_LH  17-11-2021 22:51:35  H6  F   30  63  33
3  BRAKE_LH  17-11-2021 22:51:36  H6  F   30  63  33
4  BRAKE_LH  17-11-2021 22:51:37  

【讨论】:

  • 我收到此错误。 raise TypeError(f"cannot convert the series to {converter}") TypeError: cannot convert the series to
  • 我认为这是因为我的另一个数据框中的一个特定列具有 -ve 值,所以只有当我不得不删除该列并尝试它工作时
  • @user_v27 没错,调用chr() 的公式应该只接受正整数。但是,只有在使用 .apply() 时才会出现错误 TypeError: cannot convert the series to <class 'int'>。按照我的建议使用.applymap() 不应出现此错误,因为我们是逐个元素处理而不是一次处理熊猫系列。
【解决方案2】:

您可以将要忽略的列放在setIGNORELIST = {'_NAME', '_TIMESTAMP'} 中。

然后遍历列名并检查名称是否被忽略。如果不是,请应用您的功能。

这是一个例子

# df = ..your dataframe..

IGNORELIST = {'colname1', 'colname2'}

for colname in df.columns:
  if not colname in IGNORELIST:
    df[colname] = df[colname].apply(lambda x: chr(round(x / 256)) + chr(x % 256)).apply(lambda x: x[::-1])

【讨论】:

  • 我不想创建新列,这些列已经在数据框中可用。我想将该函数应用于给定数据框中的所有列,除了忽略列表(_NAME,_TIMESTAMP)
  • 这只是一个例子,我假设你有自己的数据框,因为你在代码中使用了df。我将删除示例数据框。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-12
  • 1970-01-01
  • 2014-03-31
  • 2021-06-16
相关资源
最近更新 更多