如何在python中为我的csv文件创建列

数据挖掘 Python 熊猫
2022-02-21 16:35:55

我有一个包含这些值的 CSV 文件(没有列):-

I:30n
J:0n
J:0n
U:1000n
C:0n
I:12n
I:10n
I:10n
I:10n
I:10n

我想为这些行值添加一个列名。

假设所有I(即:I:30n、I:12n 等)值记录应该在一列中,同样所有J(即 J:0n、J:0n)都应该在一列中,反之亦然。

任何人都可以帮忙吗?

1个回答

您可以为此使用 Pandas,您的文件格式不完全是逗号分隔值文件。但是您仍然可以使用 pandas read_csv()方法。假设你的文件名是test_file

import pandas as pd
df = pd.read_csv('test_file', sep=':', header=None)
>>> df
   0      1
0  I    30n
1  J     0n
2  J     0n
3  U  1000n
4  C     0n
5  I    12n
6  I    10n
7  I    10n
8  I    10n
9  I    10n

然后你可以使用pivot()函数:

>>> df.pivot(columns=0)
\     1                 
0    C    I    J      U
0  NaN  30n  NaN    NaN
1  NaN  NaN   0n    NaN
2  NaN  NaN   0n    NaN
3  NaN  NaN  NaN  1000n
4   0n  NaN  NaN    NaN
5  NaN  12n  NaN    NaN
6  NaN  10n  NaN    NaN
7  NaN  10n  NaN    NaN
8  NaN  10n  NaN    NaN
9  NaN  10n  NaN    NaN

如果您打算将其写回文件,则可以使用to_csv()方法。

# this row eliminates the level headers of the columns at level 0
>>> df.columns=df.columns.get_level_values(1)
>>> df
0   C    I   J      U
0      30n           
1           0n       
2           0n       
3               1000n
4  0n                
5      12n           
6      10n           
7      10n           
8      10n           
9      10n           
>>> df.to_csv('new_test_file', index=False)

或者

如果你想让它变得不那么稀疏,你可以先把它变成一个dict,然后再回到DataFrame:

>>> _dict = df.groupby(0)[1].apply(list).to_dict()
>>> _dict
{'C': ['0n'], 'I': ['30n', '12n', '10n', '10n', '10n', '10n'], 'J': ['0n', '0n'], 'U': ['1000n']}
>>> pd.DataFrame.from_dict(_dict, orient='index')
       0     1     2     3     4     5
C     0n  None  None  None  None  None
I    30n   12n   10n   10n   10n   10n
J     0n    0n  None  None  None  None
U  1000n  None  None  None  None  None

>>> pd.DataFrame.from_dict(_dict, orient='index').T
      C    I     J      U
0    0n  30n    0n  1000n
1  None  12n    0n   None
2  None  10n  None   None
3  None  10n  None   None
4  None  10n  None   None
5  None  10n  None   None

pd.Series.to_dict() pd.DataFrame.from_dict() pd.DataFrame.T