Python 大熊猫的数据咀嚼
我有一个CSV文件,其中的行如下所示:Python 大熊猫的数据咀嚼,python,pandas,dataframe,data-manipulation,data-munging,Python,Pandas,Dataframe,Data Manipulation,Data Munging,我有一个CSV文件,其中的行如下所示: ID,98.4,100M,55M,65M,75M,100M,75M,65M,100M,98M,100M,100M,92M,0#,0N#, 我可以用中文读 #!/usr/bin/env python import pandas as pd import sys filename = sys.argv[1] df = pd.read_csv(filename) 给定一个特定的列,我想按ID分割行,然后输出每个ID的平均值和标准偏差 我的第一个问题是,如
ID,98.4,100M,55M,65M,75M,100M,75M,65M,100M,98M,100M,100M,92M,0#,0N#,
我可以用中文读
#!/usr/bin/env python
import pandas as pd
import sys
filename = sys.argv[1]
df = pd.read_csv(filename)
给定一个特定的列,我想按ID分割行,然后输出每个ID的平均值和标准偏差
我的第一个问题是,如何删除数字中的所有非数字部分,例如“100M”和“0N#”,它们应该分别为100和0
我还尝试在相关的标题上循环并使用
df[header].replace(regex=True,inplace=True,to_replace=r'\D',value=r'')
如中所述
但是,这会将98.4更改为984。使用:
如果您有浮点数,则可以使用以下正则表达式:
In [379]:
t="""ID,98.4,100.50M,55.234M,65M,75M,100M,75M,65M,100M,98M,100M,100M,92M,0#,0N#"""
df = pd.read_csv(io.StringIO(t), header=None)
df
Out[379]:
0 1 2 3 4 5 6 7 8 9 10 11 \
0 ID 98.4 100.50M 55.234M 65M 75M 100M 75M 65M 100M 98M 100M
12 13 14 15
0 100M 92M 0# 0N#
In [380]:
for col in df.columns[2:]:
df[col] = df[col].str.extract(r'(\d+\.?\d+)').astype(np.float)
df
Out[380]:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
0 ID 98.4 100.5 55.234 65 75 100 75 65 100 98 100 100 92 NaN NaN
因此,(\d+\.?\d+
查找包含\d+
1个或多个具有\.?
可选小数点且在小数点后包含\d+
1个或多个数字的组
编辑
确定编辑了我的正则表达式模式:
In [408]:
t="""Name,97.7,0A,0A,65M,0A,100M,5M,75M,100M,90M,90M,99M,90M,0#,0N#"""
df = pd.read_csv(io.StringIO(t), header=None)
df
Out[408]:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 \
0 Name 97.7 0A 0A 65M 0A 100M 5M 75M 100M 90M 90M 99M 90M 0#
15
0 0N#
In [409]:
for col in df.columns[2:]:
df[col] = df[col].str.extract(r'(\d+\.*\d*)').astype(np.float)
df
Out[409]:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
0 Name 97.7 0 0 65 0 100 5 75 100 90 90 99 90 0 0
我的第一个问题是,如何删除数字中的所有非数字部分,例如“100M”和“0N#”,它们应该分别为100和0
在这里,.stack()
将数据帧转换为一个序列,.apply()
为每个值调用lambda,re.sub()
删除任何非数字字符,.astype()
转换为数字,取消堆栈()
将序列转换回数据帧。这同样适用于整数和浮点数
给定一个特定的列,我想按ID分割行,然后输出每个ID的平均值和标准偏差
@Evert的可能重复项添加了一个编辑,以显示我需要如何处理小数点。我列出的重复项建议使用
rstrip
,其中包含要删除的字符。因此……rstrip('MN#')
应该可以很好地用于您的输入,使用副本中建议的lambda(当然,您可以省略lstrip
部分)。@Evert问题是MN不是唯一的非数字字符。我想我也必须做lstrip吗?@Evert我的头循环也不起作用<代码>用于列表中的标题(df)[9:-3]:为我提供列而不是标题。正确的方法是什么?df=pd.read_csv(io.StringIO(t),header=None)TypeError:initial_值必须是unicode或None,而不是strIgnoreio.StringIO
位这只是我在你的情况下将文本作为文件对象读取df=pd.read_csv(filename)
很好如果这是整个文件名,97.7,0A,0A,0A,65M,0A,100M,5M,75米,100米,90米,90米,99米,90米,0#,0N#,“你的代码给我”0名楠楠楠楠楠楠楠楠65楠楠楠100楠楠75 100 90 90 99楠楠楠楠楠楠楠楠楠楠楠楠楠楠楠楠楠楠楠楠“编辑的版本更好,并提供0名称NaN 0 0 65 0 100 5 75 100 90 90 99 90 0 NaN
。这仍然在一开始就扼杀了97.7。我看不出来,你能把原始的输入数据和代码放到你的问题中吗
In [408]:
t="""Name,97.7,0A,0A,65M,0A,100M,5M,75M,100M,90M,90M,99M,90M,0#,0N#"""
df = pd.read_csv(io.StringIO(t), header=None)
df
Out[408]:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 \
0 Name 97.7 0A 0A 65M 0A 100M 5M 75M 100M 90M 90M 99M 90M 0#
15
0 0N#
In [409]:
for col in df.columns[2:]:
df[col] = df[col].str.extract(r'(\d+\.*\d*)').astype(np.float)
df
Out[409]:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
0 Name 97.7 0 0 65 0 100 5 75 100 90 90 99 90 0 0
import re
df = pd.read_csv(yourfile, header=None)
df.columns = ['ID'] + list(df.columns)[1:]
df = df.stack().apply(lambda v: re.sub('[^0-9]','', v)
if isinstance(v, str) else v).astype(float).unstack()
df.groupby('ID').agg(['std', 'mean'])
# for all columns
df.groupby('ID').agg(['std', 'mean'])
# for specific column
df.groupby('ID')['<colname>'].agg(['std', 'mean'])
from StringIO import StringIO
s="""
1,98.4,100M,55M,65M,75M,100M,75M,65M,100M,98M,100M,100M,92M,0#,0N#,
1,98.4,100M,55M,65M,75M,100M,75M,65M,100M,98M,100M,100M,92M,0#,0N#,
2,98.4,100M,55M,65M,75M,100M,75M,65M,100M,98M,100M,100M,92M,0#,0N#,
2,98.4,100M,55M,65M,75M,100M,75M,65M,100M,98M,100M,100M,92M,0#,0N#,
"""
yourfile = StringIO(s)