【问题标题】:Python 2.7 / Pandas: writing new string from each row in dataframePython 2.7 / Pandas:从数据框中的每一行写入新字符串
【发布时间】:2015-11-14 13:55:23
【问题描述】:

在 Pandas 中,我有一个从 csv 编写的数据框。我的最终目标是从该 CSV 生成 XML 模式,因为 CSV 中的每个项目都对应一个模式变量。唯一的解决方案(我能想到的)是从该数据框中读取每个项目,以便它生成一个文本文件,数据框中的每个值都由一个字符串包围。

TableName  Variable      Interpretation   Col4   Col5
CRASH      CRASH_ID      integer          1     
CRASH      SER_NO        range            0
CRASH      SER_NO        code             99999
CRASH      CRASH_MO_NO   code             1      January
CRASH      CRASH_MO_NO   code             2      February

这会生成一个文本文件,结果类似于(以第一行为例):

<table = "CRASH">
<name = "CRASH_ID">
<type = "integer">
<value = "1">

其中&lt;table = &gt;, &lt;name = &gt; 都是字符串。不必专门对它们进行格式化(尽管这样会很好)——我只需要一种更快的方法来生成这个模式,而不是从 CSV 文件中手动输入。

似乎最好的方法是读取每一行并生成一个字符串,同时将其写入输出文件。我看过 .iterrows() 方法,但这并不能让我连接字符串和元组。我也有looked 来自other 用户的一些posts,但他们的重点似乎更多地放在计算数据帧中的内容或更改数据本身,而不是从每一行生成一个字符串。

我当前的代码如下。我知道 pandas 基于 Numpy 数组,并且运行“for i in df”循环不是一种有效的方法,但我不确定从哪里开始。

编辑:某些行可能需要循环显示以某种方式。例如,模式有多个附加字符串的值代码:

<values>
<value code = "01">January</value>
<value code = "02">February</value>
<value code = "03">March</value>
</values>

我在想也许我可以通过“解释”对价值观进行分组?然后,如果他们有“代码”解释,我可以对组进行某种迭代,以便显示所有代码。

这是我目前的代码,供参考。我已对其进行了更新,以反映 Randy 在下面的出色建议。我还编辑了上面的帖子以反映一些更新的问题。

import pandas as pd

text_file = open(r'oregon_output.txt', 'w')

df = pd.read_csv(r'oregon_2013_var_list.csv')

#selects only CRASH variables
crash = df['Col1'] == 'CRASH'
df_crash = df[crash]

#value which will be populated with code values from codebook
code_fill = " " 

#replaces NaN values in dataframe wih code_fill
df_crash.fillna(code_fill, inplace = True)

for row_id, row in df.iterrows():
    print '<variable>'
    for k, v in row.iterkv():
        if v is not None:
            print '<{} = "{}">'.format(k, v)
    print '</variable>'
    print

【问题讨论】:

  • 有点。但是,我的架构有稍微不同的需求——我在我的问题上添加了更多内容以扩展它。另外,我不完全理解该问题的答案,并且我不想破坏该线程,因为它是在两年前发布的......谢谢您的回复,但它仍然很有帮助!

标签: python python-2.7 pandas dataframe


【解决方案1】:

只遍历它并吐出单独的行可能确实有意义:

for row_id, row in df.iterrows():
    for k, v in row.iterkv():
        if v is not None:
            print '<{} = "{}">'.format(k, v)
    print

【讨论】:

  • 感谢您的评论。不幸的是,我不完全确定我理解 .iterkv() 方法,并且因为它似乎使用了您任意选择的参数(即 k,v),所以我无法用谷歌搜索它。您能否详细介绍一下该方法是什么,以及您选择它的原因?
  • k, v 代表每个键值对。
【解决方案2】:

在这种情况下,您可能需要考虑一个to_dict() 方法:

In [178]:
df.columns = ['table','name','type','value']
[["<%s='%s'>"%(k,v) for k,v in D.items()] for D in df.to_dict('records')]

Out[178]:
[["<table='CRASH'>", "<type='integer'>", "<name='CRASH_ID'>", "<value='1.0'>"],
 ["<table='CRASH'>", "<type='range'>", "<name='SER_NO'>", "<value='0.0'>"],
 ["<table='CRASH'>", "<type='code'>", "<name='SER_NO'>", "<value='99999.0'>"],
 ["<table='CRASH'>", "<type='string'>", "<name='CRASH_DT'>", "<value='nan'>"]]

【讨论】:

    猜你喜欢
    • 2015-04-23
    • 2017-09-18
    • 1970-01-01
    • 2016-11-15
    • 1970-01-01
    • 2013-06-11
    • 1970-01-01
    • 2022-12-03
    • 1970-01-01
    相关资源
    最近更新 更多