【问题标题】:Write data if it matches a criterion如果符合条件则写入数据
【发布时间】:2015-12-18 23:39:11
【问题描述】:

我有一个包含 3000 多个变量的数据文件。每行包含来自一个人的数据。并非所有人都有每个变量的数据。换句话说,数据文件如下所示:

V1,V2,V3,V4,V5,V6
ID1, ,  , 4, 2, 
ID2,1, 2,  ,  ,  
ID3,1,  ,  ,  , 3

我想为每一行(即,对于每个人)做的是将该行的数据放入其自己的 .csv 文件中。不过,问题是我只想要那个人有价值的变量。所以 ID1 的 .csv 文件看起来像:

V1,V4,V5
ID1,4, 2

我尝试从以下内容开始,但不知道如何继续:

df_datafile = pd.read_csv('data.csv')
df_datafile2 = df_datafile.fillna(0)
for row in df_datafile2.itertuples():
    index,V1,V2,V3,V4,V5,V6 = row
    file = open("%s.txt" % (V1),"w")
    for column in df_datafile:
        if column != 0:
            file.write("%s" % (column))

然而,所有这些代码所做的只是给了我以 V1 命名的 .csv 文件中的所有变量名。

【问题讨论】:

  • 那么你有缺失值的地方它们在df中显示为NaN吗?你可以做df.apply(lambda x: x.dropna().to_csv(str(x['V1']) + '.txt'), axis=1)
  • 我建议不要将file 用于您的open() 对象。 file('name') 返回一个文件对象。

标签: python csv numpy pandas


【解决方案1】:

怎么样:

df_datafile = pd.read_csv('data.csv')
for row, data in df_datafile.iterrows():
    data.dropna().to_frame().transpose().to_csv('file_{}.csv'.format(row))

如果您稍后再次删除 0 值,您可能会跳过 fillna() 步骤(这就是它不显示 df_datafile2 的原因)。

【讨论】:

  • 这完全无法解决 OP 不写入没有值的列的要求,这不会写出所有缺失值的列替换为0吗?
  • 这与我正在寻找的非常接近。还有三件事:1)我如何完全删除对该参与者没有值的变量?所有变量都被写入新文件; 2) .to_csv() 转置变量,因此它们现在位于一列而不是一行。在写入文件之前只使用 .transpose() 是最好的解决方案吗? 3) 如何将 V1 变量写为每个单独的 .csv 文件的名称?关于 EdChum 的评论,没有值的变量的输出是空白/空(即,不带 0)。
  • 要使.dropna() 生效,值必须是np.nan。如果您的缺失值与np.nan 以外的某个值一起出现,您可以将na_values 指定为.read_csv() 参数。一旦您的缺失值是np.nandropna() 将删除所有这些值。pandas.pydata.org/pandas-docs/version/0.17.1/generated/…
  • 要横向书写,.transpose() 可能是最好的方法 - 请参阅更新的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-06
  • 1970-01-01
  • 2011-07-18
相关资源
最近更新 更多