Python 大熊猫的数据咀嚼

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的平均值和标准偏差 我的第一个问题是,如

我有一个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的平均值和标准偏差

我的第一个问题是,如何删除数字中的所有非数字部分,例如“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,而不是strIgnore
io.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)