【问题标题】:I'd like to capture several cell values from a CSV file and write to a new column我想从 CSV 文件中捕获多个单元格值并写入新列
【发布时间】:2018-10-17 20:05:58
【问题描述】:

所以,我是 Python 新手。我一直在尝试将我学到的东西应用到现实世界的问题上。我给自己定的任务是这样的..

我想捕获两个单元格值 '01/01/2018 和 '08/01/2018' 并将它们打印到标题值日期下的新 csv.file 中。我还想创建一个新列,该列显示原始 csv 文件中与该日期关联的值。

任何帮助将不胜感激或指出正确的方向。

原表

Hierarchy   | Dept   | Emp | Alpha | Bravo | Charlie | 01/01/2018 | 08/01/2018|
Hierarchy 1 | Dept 1 | JC  | h     | o     | l       | 0          | 2         |

新表

Hierarchy   |Dept   | Emp | Alpha | Bravo | Charlie    | Date       |Value |
Hierarchy 1 |Dept 1 | JC  | h     | o     | l          | 01/01/2018 | 0    |
Hierarchy 1 |Dept 1 | JC  | h     | o     | l          | 08/01/2018 | 2    |

【问题讨论】:

  • 我会研究 pandas,特别是 melt 函数。
  • @ChristianSloper 谢谢!我会调查的!
  • 如果你遇到困难,请告诉我,如果你愿意,我可以写一个例子。
  • @ChristianSloper 如果你能写一个很棒的演示?

标签: python database pandas csv


【解决方案1】:

正如@ChristianSloper 在他的评论中提到的,pd.melt 就是为此而设计的。在你的情况下,这是一个单行:

df
     Hierarchy    Dept Emp Alpha Bravo Charlie  01/01/2018  08/01/2018
0  Hierarchy_1  Dept_1  JC     h     o       l           0           2

pd.melt(df, 
        id_vars=df.columns[:-2], 
        value_vars=df.columns[-2:],
        var_name='Date', 
        value_name='Value')
     Hierarchy    Dept Emp Alpha Bravo Charlie        Date  Value
0  Hierarchy_1  Dept_1  JC     h     o       l  01/01/2018      0
1  Hierarchy_1  Dept_1  JC     h     o       l  08/01/2018      2

【讨论】:

  • 我可以创建一个变量来保存我的 csv 文件并在 pd.melt 中调用它,而不是在我的代码中包含数据框?我还需要将新数据写入新的 csv 文件吗?
  • 是的,您首先需要使用df = pd.read_csv(path_to_filename) 读取您的csv。你可以用df2 = pd.melt(...) 存储pd.melt 的结果。
  • ...最后,您可以使用df2.to_csv(path_to_file)melted DataFrame 写入新的csv
  • 嘿彼得,我仍在努力实施您的解决方案。你能看看我的 git repo 并查看代码吗,那里有一个输出的 csv 文件,但它的数据格式不正确。任何帮助将不胜感激!github.com/tdle/python
  • 啊,我认为问题是在data_export.py 中,您调用pd.melt 两次并将结果分配给df2,覆盖了第一个结果!删除第 14 行 df2 = pd.melt(df),然后尝试重新运行代码。此外,请注意id_vars 中引用字符串中的空格。 'Emp ''Emp' 不同。我猜正确的列名是'Emp',没有空格。
【解决方案2】:

好的, 我将继续假设您的表存储在 csv 文件中。因此,我们将从以下内容开始阅读:

import pandas as pd

df = pd.read_csv('mytable.csv',sep='|')
pd.melt(df, 
       id_vars = ['Hierarchy   ', ' Dept   ', ' Emp ', ' Alpha ', ' Bravo ', ' Charlie '],
       value_vars=[' 01/01/2018 ',' 08/01/2018' ],
       var_name='Date', 
       value_name='Value')

给出想要的结果。

【讨论】:

  • 嘿,克里斯,是的,我的表格存储在一个 csv 文件中,我试试看!感谢您的帮助!
  • 嘿,克里斯,我尝试了您的解决方案,但它返回一个错误,指出 id_vars 中的值不在 columns 中。您能否查看我的 git 存储库并就我迄今为止编写的代码提供任何建议?干杯! github.com/tdle/python
  • 听起来文件中的列名与您在示例中的不同。记住空格很重要。加载数据框后打印出“df.columns”以查看列名。
【解决方案3】:

在贡献者的帮助下我完成了我的任务,下面是我使用的代码! 感谢社区提供帮助!

"""
Transforms Data into Desired Format
"""

#import pandas module
import pandas as pd

#create variable where df = to data.csv
df = pd.read_csv('data.csv')

#create new variable for df.columns
cols = df.columns
#use .melt() function to complete data manipulation
transformed_df = pd.melt(df,
                         id_vars=cols[:6],
                         value_vars=cols[6:])

#Assert Data has been formatted correctly
print(transformed_df)

#create new csv file with new data
transformed_df.to_csv('melted_data.csv')

print("\nData has been Melted!") 

【讨论】:

    猜你喜欢
    • 2021-01-03
    • 1970-01-01
    • 2022-01-14
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 2013-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多