【问题标题】:Selecting Values in a csv file using pandas and compute them使用 pandas 选择 csv 文件中的值并计算它们
【发布时间】:2018-10-23 01:32:50
【问题描述】:

我是编码新手,对于一个项目,我需要使用 pandas 在 csv 文件中选择值并计算这些值。我想要的是选择两列和多行来计算它们,例如,将一列乘以另一列。我成功地选择了值但没有计算它们,这就是我所拥有的。

import pandas as pd`
data = pd.read_csv("csvfilet.csv", delimiter=";", decimal=",")
print(data.iloc[57:67, 3])
print(data.iloc[57:67, 7])
data.iloc[57:68, 3] = data.iloc[57:68, 3]*data.iloc[57:68, 7]
print(data.iloc[57:68, 3])

它首先用 data.iloc() 正确打印我想要的两列,但似乎我不能这样做它向我显示:

不能将序列乘以“str”类型的非整数 所以我尝试了这个:

import pandas as pd
data = pd.read_csv("csvfilet.csv", delimiter=";", decimal=",")
print(data.iloc[57:67, 3])
print(data.iloc[57:67, 7])
x=data.iloc[57:68, 7:8]
y=data.iloc[57:68, 3:4]
z=x*y
print(z)

它给了我用 NaN 替换值的两列。 有没有办法直接在 csv 文件中计算我们选择的值(按行和列)?

*编辑:我需要提取值的 csv 文件如下所示:

[Name];[Switching (us)];[Memory (byte)];;;;;;;;;
S1;20,5;;;;;;;;;;
S3;;256;;;;;;;;;
[Name];[Priority];[ArrivalType];[MinDistance (ms)];[MaxDistance (ms)];[SizeType];[Min Size (byte)];[MaxSize (byte)];[BurstSize];[Sender];[Receiver];[Latency (ms)]
FL_1;1;Periodic;5;;ETHERNET_FRAME_SIZE;;100;;Node4;Node6;2
FL_2;1;Periodic;2;;ETHERNET_FRAME_SIZE;;20;;Node3;Node4;1,5

例如,我需要选择 FL_1 右侧的“5”,并将其乘以同一行的“100”。

【问题讨论】:

  • 只需将它们转换为数字..
  • 可以添加列类型列表吗?添加data.dtypes的输出
  • 在第一次尝试中,我不明白 - 你真的想用第 3 列 * 第 7 列替换第 3 列吗? data[z] = data[x] * data[y] 是你要找的,我相信。
  • 是的,我尝试将第 3 列替换为第 3 列 * 第 7 列,感谢您的回答,将对其进行测试。

标签: python pandas


【解决方案1】:

你可以试试:

data.iloc[57:68, 3] = (data.iloc[57:68, 3].astype(int).values 
                      * data.iloc[57:68, 7].astype(int).values)

将您的范围从 iloc 转换为输入 int 并将值相乘。

更新

所以这里的主要问题是您错误地读取了文件,从您的示例文本中,有 2 种不同的数据结构。在下面的代码中,我使用skiprows 删除了您不需要的数据。

import pandas as pd
data = pd.read_csv("csvfilet.csv", delimiter=";", decimal=",", skiprows = 3)
print(data.iloc[0, 3])
print(data.iloc[0, 7])

#create a new series in your frame
data['NewMinDistance'] = data['[MinDistance (ms)]'].astype(int) * data['[MaxSize (byte)]'].astype(int)
data[['[Name]','[MinDistance (ms)]','[MaxSize (byte)]','NewMinDistance']]

#or with your earlier method, directly assign it to a dataframe position
data.iloc[0, 3] =   (data.iloc[0, 3].astype(int) * data.iloc[0, 7].astype(int))

您之前的示例使用位置分配,您使用iloc 直接将新值分配给数据框。根据您的要求,我上面的回答还包括使用您需要的值创建一个新列,而不是将其分配给数据框中的当前值。

【讨论】:

  • 感谢您的帮助,但我遇到了另一个问题,我只是遇到错误“无法将输入数组从形状 (2) 广播到形状 (11)”和“无法将字符串转换为浮点数: '3,25'",我将 .astype(int) 更改为 .astype(float) 但我有同样的错误。
  • 你能发布你的数据框的内容吗?发生这些错误的原因可能有多种,而且范围太广,无法进行故障排除。
  • 有没有办法在帖子上发送 csv 文件?文件中有很多信息。
  • 分享一个小sn-p 让人们重现您的问题总是一个更好的做法。而不是倾倒全部。例如,您可以手动构建示例数据框。
  • 我尝试手动构建数据框,它正在工作,但我需要直接选择 csv 文件上的值并计算它们,但我将举例说明数据框的外观(在 .txt 上)在帖子上。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-21
  • 2013-04-18
  • 2014-11-03
相关资源
最近更新 更多