如何在csv列中使用逗号分隔多个浮点值?

lfapxunr  于 2023-11-14  发布在  其他
关注(0)|答案(2)|浏览(124)

我有一个问题与这个问题密切相关:
How to convert .wav files into a Pandas DataFrame in order to feed it to a neural network?
我用以下代码创建了一个pandas DataFrame:

df = pd.DataFrame(data={"wavsamples": pd.Series(wavsamples), "wavsamplerate": pd.Series(wavsamplerate), "wavname": pd.Series(wavname)}, copy=False, columns = ['wavsamples','wavsamplerate','wavname'])
df.index.name = 'filenumber'

字符串
如果我打印pandas DataFrame中的第二列,

print(df.wavsamples.to_string(index=False))


它向我展示了Pandas系列“wavsamples”,看起来像这样:

[0.02709961, 0.06796265, -0.011810303, -0.23361...
[0.0068969727, 0.04547119, 0.043029785, -0.1025...
[-0.005432129, 0.021057129, 0.078063965, 0.0270...
[0.00079345703, 0.064941406, 0.09710693, -0.088...
[-0.0067749023, 0.008087158, 0.06536865, 0.0219...
[-0.008758545, 0.015106201, 0.08139038, 0.02600...
[-0.0034179688, 0.039733887, 0.07711792, 0.1164...
[-0.0008087158, -0.000579834, -0.00062561035, -...
[0.021026611, 0.029907227, 0.040527344, 0.05448...
[0.017288208, 0.026321411, 0.0340271, 0.0403137...
[0.019561768, 0.026611328, 0.03668213, 0.047576...
[0.022827148, 0.03414917, 0.056289673, 0.078018...


这12行中的每一行都表示.wav文件的原始浮点样本值。现在,如果我将这些数组写入CSV文件的列中,并使用:

df.to_csv("./test.csv", sep=',', columns = ['wavsamples','wavsamplerate','wavname'])


我得到以下CSV文件:

filenumber,wavsamples,wavsamplerate,wavname
0,"[ 0.02709961  0.06796265 -0.0118103  ... -0.36627197 -0.36645508
 -0.3657837 ]",44100,Audio1.wav
1,"[ 0.00689697  0.04547119  0.04302979 ... -0.03359985 -0.03244019
 -0.03167725]",44100,Audio2.wav
2,"[-0.00543213  0.02105713  0.07806396 ...  0.45645142  0.45541382
  0.45510864]",44100,Audio3.wav
3,[0.00079346 0.06494141 0.09710693 ... 0.22116089 0.22421265 0.22741699],44100,Audio4.wav
4,"[-0.0067749   0.00808716  0.06536865 ...  0.24209595  0.23977661
  0.23754883]",44100,Audio5.wav
5,"[-0.00875854  0.0151062   0.08139038 ... -0.0256958  -0.0184021
 -0.01156616]",44100,Audio6.wav
6,"[-0.00341797  0.03973389  0.07711792 ...  0.41384888  0.41375732
  0.41348267]",44100,Audio7.wav
7,"[-0.00080872 -0.00057983 -0.00062561 ...  0.0100708   0.0100708
  0.01000977]",44100,Audio8.wav
8,[0.02102661 0.02990723 0.04052734 ... 0.00976562 0.00965881 0.00990295],44100,Audio9.wav
9,[0.01728821 0.02632141 0.0340271  ... 0.01344299 0.01341248 0.01325989],44100,Audio10.wav
10,[0.01956177 0.02661133 0.03668213 ... 0.0141449  0.01400757 0.01402283],44100,Audio11.wav
11,[0.02282715 0.03414917 0.05628967 ... 0.01019287 0.01037598 0.01025391],44100,Audio12.wav


所以列'wavsamples'丢失了所有的逗号。如果我现在从csv文件中读取并打印列:

with open("./test.csv", "r") as csv_file:
    reader = csv.reader(csv_file)
    rows = list(reader)
    audiofile = rows[12][1]
    print(audiofile)


我只得到:
第一个月
不仅所有的逗号都被删除了,而且由于wavsamples列被视为字符串,三个点被误认为是文字点字符,因此当将它们写入CSV时,中间的所有样本值都会丢失。
我知道CSV可能是存储.wav数据的最差格式,就像在这里多次指出的堆栈溢出一样.但我只是好奇-有没有办法在CSV列内的浮点值之间存储音频数组?
当我从csv中读取一些内容时,我想得到这样的结果:

[0.022827148, 0.03414917, 0.056289673, 0.078018...


而不是这样:

[0.02282715 0.03414917 0.05628967 ... 0.01019287 0.01037598 0.01025391]

我如何编写csv列,以便以后能够正确地阅读它?

wr98u20j

wr98u20j1#

CSV格式不支持列中的列表类型,你需要标量值。这里发生的是pandas将隐式地将包含列表类型的列转换为字符串。它与你选择的类型无关。
如果你必须使用CSV格式,一种可能的处理方法是使用ast.literal_eval将其解析回列表类型,当你读回数据时,将其应用于该列。

import pandas as pd
import numpy as np

df = pd.DataFrame({'a': [[1, 2], [2, 3], [3, 4]],
                   'b': [4, 5, 6]})
print(df.head())

df.to_csv('nested_test.csv', index=False)

df = pd.read_csv('nested_test.csv')
print(df.head()

for _, row in df.iterrows():
    # Note that, though it *looked* like a list in df.head()
    # we just get [ printed, as the first character of the
    # string it actually is
    print(row['a'][0]) 
      
import ast  
df['a'] = df['a'].apply(ast.literal_eval)

for _, row in df.iterrows():
    print(row['a'][0]) # Now we get the first item in the list

字符串
如果你使用polars而不是pandas,这种隐式转换将是不允许的,它会抛出一个异常。尽管事实上it has a List type as a first-class citizen。对于这种数据,你真的应该考虑一种格式,比如parquet,它不仅解析速度快 * 很多倍 *,而且会原生地处理列的嵌套结构。
最后,在你的问题中,你指定使用csv模块来读回数据。你可以这样做,但我不认为这是特别优雅的,考虑到我提到的对CSV的限制。这适用于我给出的例子,它假设所有其他非列表列都是int,否则你需要逐个处理它们。

import csv

with open('nested_test.csv') as infile:
    reader = csv.reader(infile)
    headers = next(reader)
    rebuilt = []
    for row in reader:
        rebuilt.extend([ast.literal_eval(row[0]), *map(int, row[1:])])
    print(rebuilt)


为了使事情更复杂,你的列中实际上没有列表,但实际上有np.ndarray对象。当它们被转换为字符串时,你失去了来自__repr__的逗号以及其他复杂性。

arr = np.array([1., 2., 3.])
print(arr)


保存自己一个额外的头痛使用:

df['a'] = df['a'].apply(np.ndarray.tolist)

  • 之前 * df.to_csv()

...你现在可能会看到为什么CSV不是一个伟大的格式在这里...

9vw9lbht

9vw9lbht2#

使用这个:

df['wavsamples'] = df['wavsamples'].apply(lambda x: ', '.join(map(str, x)))

字符串
更多信息请查看:

import pandas as pd
import numpy as np

data = {'Values': [np.array([0.02709961, 0.06796265, -0.0118103, -0.36627197, -0.36645508, -0.3657837])]}
df = pd.DataFrame(data)
# Converting the NumPy array to a comma-separated string
df['Values'] = df['Values'].apply(lambda x: ', '.join(map(str, x)))
print(df)

相关问题