我有一个具有以下结构的 .csv 文件:
X310.433,Y9.6
X310.54,Y10
X143.52
X144.77
当一行中没有“X”或“Y”值时,我想从上面的行中获取值并将其复制到后面的行,即缺少该值。 对于本示例,将 Y10 复制到下一行,并用逗号分隔。 我怎样才能用Python做到这一点?
您可以简单地将最新看到的
x
和 y
值存储在变量中 -
csv_str = '''
X310.433,Y9.6
X310.54,Y10
X143.52
X144.77
,Y71.21
'''
csv_file = io.StringIO(csv_str) # You'd probably do csv_file = open('fielname.csv', 'r') here instead of io.StringIO
for line in csv_file:
if line.strip():
xval, *yval = line.strip().split(',')
if xval:
latest_x = xval
if yval:
latest_y, *_ = yval
print(latest_x, latest_y, sep=',')
输出
X310.433,Y9.6
X310.54,Y10
X143.52,Y10
X144.77,Y10
X144.77,Y71.21
import pandas as pd
df = pd.read_csv('a.csv', names=['X', 'Y'])
df.fillna(method='ffill', inplace=True)
df.to_csv('ret.csv', index=False, header=False)
试试这个:
import pandas as pd
df = pd.read_excel('loc to your csv/your_csv.xlsx')
print(df)
df['a'] = df['a'].apply(lambda x: x.split(','))
print(df)
x1 = df.loc[0, 'a'][0].split(',')[0][1:]
y1 = df.loc[0, 'a'][1].split(',')[0][1:]
x2 = df.loc[1, 'a'][0].split(',')[0][1:]
y2 = df.loc[1, 'a'][1].split(',')[0][1:]
m=(float(y2)-float(y1))/(float(x2)-float(x1))
c=float(y1)-(m*float(x1))
y3=(m*float(df.loc[2,'a'][0][1:]))+c
y4=(m*float(df.loc[3,'a'][0][1:]))+c
print(f'{y3}{y4}')
df.loc[2]='X'+str(df.loc[2,'a'][0][1:])+'Y'+str(y3)
df.loc[3]='X'+str(df.loc[3,'a'][0][1:])+'Y'+str(y4)
df.to_csv('loc to output/output.csv', index=False)
无需任何实用模块,您就可以做到这一点:
假设文件内容是:
X310.433,Y9.6
Y999
X310.54,Y10
X143.52
X144.77
...然后...
lines: list[tuple[str, str]] = []
with open("foo.csv") as foo:
for line in map(str.strip, foo):
if line:
a, *b = line.split(",")
if a[0] == "X":
if b:
lines.append((a, b[0]))
else:
lines.append((a, lines[-1][1]))
else:
assert a[0] == "Y"
if b:
lines.append((b[0], a))
else:
lines.append((lines[-1][0], a))
for line in lines:
print(",".join(line))
输出:
X310.433,Y9.6
X310.433,Y999
X310.54,Y10
X143.52,Y10
X144.77,Y10
注:
如果文件的第一行包含 X 或 Y 之一(但不是两者),则此操作将会失败