簡體   English   中英

Python 2.7 / Pandas:從數據框中的每一行寫入新字符串

[英]Python 2.7 / Pandas: writing new string from each row in dataframe

在熊貓中,我有一個從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">

其中<table = >, <name = >都是字符串。 它們不必專門以這種方式進行格式化(盡管那會很好)-我只需要一種比從CSV文件中手動輸入所有模式更快的方式來生成該模式。

似乎最好的方法是讀取每一行並在將其寫入輸出文件時生成一個字符串。 我已經看過.iterrows()方法,但這不能讓我連接字符串和元組。 我也看過 其他用戶的一些帖子 ,但他們的重點似乎更多地放在計算數據框內的內容或更改數據本身,而不是從每一行生成字符串。

我當前的代碼如下。 我知道熊貓基於Numpy數組,並且在“ for i in df”循環中運行不是一種有效的方法,但是我不確定從哪里開始。

編輯:某些行可能需要循環顯示某種方式。 例如,模式具有多個附加了字符串的值代碼:

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

我在想也許我可以通過“解釋”對價值觀進行分組? 然后,如果他們具有“代碼”解釋,我可以對整個組進行某種迭代,以便顯示所有代碼。

這是我當前的代碼,以供參考。 我對其進行了更新,以反映出蘭迪的出色建議。 我還編輯了以上帖子,以反映一些更新的關注點。

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

僅遍歷它並吐出單獨的行可能確實有意義:

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

在此處輸入圖片說明

在這種情況下,您可能要考慮一個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'>"]]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM