如何将上面一行中的“X”或“Y”值添加到缺少该值的行?

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

我有一个具有以下结构的 .csv 文件:

X310.433,Y9.6

X310.54,Y10

X143.52

X144.77

当一行中没有“X”或“Y”值时,我想从上面的行中获取值并将其复制到后面的行,即缺少该值。 对于本示例,将 Y10 复制到下一行,并用逗号分隔。 我怎样才能用Python做到这一点?

python read.csv
4个回答
0
投票

您可以简单地将最新看到的

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

0
投票
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)

0
投票

试试这个:

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)

0
投票

无需任何实用模块,您就可以做到这一点:

假设文件内容是:

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 之一(但不是两者),则此操作将会失败

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