Pandas 数据框:将特定值写入具有特定格式的文件?

问题描述 投票:0回答:1

我想更新外部文件。我想通过将 Pandas 数据帧中的新数据写入特定格式的文件来实现此目的。

这是文件中前两个数据块的示例(当我将数据写入文件时,我希望数据帧中的新数据看起来像这样)。 “

identifieri
”是数据块和数据帧的唯一名称。

(Lines of comments, then)
identifier1       label2 = i \ label3        label4                                  
label5
A1 = -5563.88 B2 = -4998 C3 = -203.8888 D4 = 5926.8 
E5 = 24.99876 F6 = 100.6666 G7 = 30.008 H8 = 10.9999
J9 = 1000000 K10 = 1.0002 L11 = 0.1
M12

identifier2       label2 = i \ label3        label4                                  
label5
A1 = -788 B2 = -6554 C3 = -100.23 D4 = 7526.8 
E5 = 20.99876 F6 = 10.6666 G7 = 20.098 H8 = 10.9999
J9 = 1000000 K10 = 1.0002 L11 = 0.000
M12
...

在数据框中,新数据位于两列中,称为

Labels
Numbers
。每个标签都有一个数字。例如,有标签
A1
B2
C3
等(见上例),对于“identifier2”数据块,对应的数字为
-788
-6554
-100.23
。但是,还有其他我不需要的数据。我只需要特定行的数据。

到目前为止,我已经尝试从数据框中获取我需要的特定标签和数字,然后将它们以附加模式写入文件。我可以从数据框中打印一个标签及其编号:

df.set_index("Labels", inplace=True)
print("Label 1", df.loc["label1", 'Numbers'])

我的计划是获取我需要的每个标签和编号,然后将它们与适当的空格一起附加到文件中。然而,当我尝试这个时:

df.loc["label1", 'Numbers'].to_csv('file.txt', mode='a', index = False, sep=' ')

我得到:

AttributeError: 'float' object has no attribute 'to_csv'

我的方法似乎很笨拙,很难弄清楚如何添加空格和换行符。如果有人知道更简单和更复杂的方法,我将不胜感激。

python python-3.x regex dataframe file-io
1个回答
0
投票

我什至不会费心使用内置实用程序,因为这是一种不寻常的输出,并且无论如何它都只需几行即可迭代

DataFrame
,并且可以让您对最终输出有很多控制。

  1. 创建一个
    str
    并添加任何标题、打开评论等
  2. 循环浏览每个标识符
  3. DataFrame
    中获取每个值并将其放入输出
    str
  4. 适当添加换行符,使其看起来像目标格式

这里是一个可运行的代码,展示了如何实现这一点(带有

rng
dfs
的字段块只是为了生成一些示例数据,可以出于您的目的而忽略)。如果有任何后续问题,请随时发表评论,或者如果我的格式错误,请告诉我,我会进行调整。

import pandas as pd
import numpy as np
import string

# Generate some random data that matches the description
rng = np.random.default_rng(seed=42)
dfs = {
    idname: pd.DataFrame(data=[
        {
            'Labels': string.ascii_uppercase[i] + str(i + 1),
            'Numbers': rng.integers(0, 1000)
        } for i in range(20)
    ]) for idname in ['identifier1', 'identifier2', 'identifier3']
}

# Make this list whatever output fields you want in the file
desired_fields = [string.ascii_uppercase[i] + str(i + 1) for i in range(11)]
# Seems like data is put into the file in groups of 4
stride = 4
# This the final string to be written to file
outstr = ''
# Add "Lines of comments"
outstr += '// comment1\n// comment2\n// comment3\n// comment4\n'
for idname, id_data in dfs.items():
    # Append the header like region
    outstr += f'{idname}       label2 = i \ label3        label4\nlabel5\n'
    # Append the "field = #" region
    for i, field in enumerate(desired_fields):
        # Grab the value from the Numbers field for the row in this
        #   DataFrame that matches that Labels value
        try:
            value = str(id_data.loc[id_data['Labels'] == field].iloc[0]['Numbers'])
        except IndexError:
            # Handle missing data here
            value = 'N/A'

        # Format that name value pair, can easily be adjusted
        outstr += f'{field} = {value} '
        # If a newline is necessary, append it based on stride
        if i % stride == stride - 1:
            outstr += '\n'
    # If the stride leaves us without a newline, add one
    if not outstr[-1] == '\n':
        outstr += '\n'
    # Add a blank space between identifiers
    outstr += '\n'

# Write to file or print or whatever
print(outstr)
with open('outputfile.txt', 'w') as fh:
    fh.write(outstr)

© www.soinside.com 2019 - 2024. All rights reserved.