我想更新外部文件。我想通过将 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'
我的方法似乎很笨拙,很难弄清楚如何添加空格和换行符。如果有人知道更简单和更复杂的方法,我将不胜感激。
我什至不会费心使用内置实用程序,因为这是一种不寻常的输出,并且无论如何它都只需几行即可迭代
DataFrame
,并且可以让您对最终输出有很多控制。
str
并添加任何标题、打开评论等DataFrame
中获取每个值并将其放入输出 str
这里是一个可运行的代码,展示了如何实现这一点(带有
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)