在pandas数据框中拆分列不会删除na

时间:2019-04-18 02:42:36

标签: python pandas csv

我将通过说我不掌握csv中数据开始的方式来开头这个问题。我也不能直接访问csv,因为我只能从没有直接访问权限的SFTP中提取它。 API显示的格式与csv显示的格式相同。这是与数据帧有关的传入csv的两列。

+-----+-------------------------------+-------------+
|     |  Sourcing Event ID (DTRM ID)  |     Site    |
+-----+-------------------------------+-------------+
| 0   |                         1035  |     ,ABC55, |
| 1   |                         1067  |          ,, |
| 2   |                         1181  |          ,, |
| 3   |                         1183  |          ,, |
| 4   |                         1184  |          ,, |
| 5   |                         1264  |          ,, |
| 6   |                         1307  |      ,DEF2, |
| 7   |                         1354  |          ,, |
| 8   |                         1369  |    ,HIJ150, |
| 9   |                         1372  |     ,DEF64, |
| 10  |                         1373  |      ,KLM9, |
| 11  |                         1374  |      ,DEF1, |
| 12  |                         1381  |          ,, |
| 13  |                         1385  |          ,, |
| 14  |                         1391  |          ,, |
| 15  |                         1394  |          ,, |
| 16  |                         1395  |          ,, |
| 17  |                         1402  |          ,, |
| 18  |                         1404  |          ,, |
| 19  |                         1405  |          ,, |
| 20  |                         1406  |          ,, |
| 21  |                         1408  |          ,, |
| 22  |                         1410  |    ,HIJ116, |
| 23  |                         1412  |          ,, |
+-----+-------------------------------+-------------+

由此,我将执行以下操作(来自先前的SO答案):

df_sourcing_events = pd.read_csv(wf['local_filename'])


            sourcing_events_melt_col = 'Sourcing Event ID (DTRM ID)'
            sourcing_events_site_col = 'Site'
            print(df_sourcing_events[[sourcing_events_melt_col,sourcing_events_site_col]])
            df_sourcing_events[sourcing_events_site_col] = df_sourcing_events[sourcing_events_site_col].str.lstrip(',')
            df_sourcing_events[sourcing_events_site_col] = df_sourcing_events[sourcing_events_site_col].str.rstrip(',')

            df_sourcing_events_sites = pd.concat([df_sourcing_events[sourcing_events_melt_col], df_sourcing_events[sourcing_events_site_col].str.split(',', expand = True)], axis = 1)\
                                                    .melt(id_vars=[sourcing_events_melt_col])\
                                                    .sort_values(by = sourcing_events_melt_col)\
                                                    .rename(columns = {'value' : sourcing_events_site_col})\
                                                    .drop(columns = ['variable'])\
                                                    .dropna()

现在您在问自己为什么要去除开头和结尾的逗号?

好吧,因为我还有另一个文件,它与具有相同确切布局的合同有关,并且我对它做了相同的事情,并且用相同的代码解决了问题。我一生都无法理解为什么我的代码输出如下:

+-----+-------------------------------+-----------+
|     |  Sourcing Event ID (DTRM ID)  |    Site   |
+-----+-------------------------------+-----------+
| 0   |                         1035  |     ABC55 |
| 1   |                         1067  |           |
| 2   |                         1181  |           |
| 3   |                         1183  |           |
| 4   |                         1184  |           |
| 5   |                         1264  |           |
| 6   |                         1307  |      DEF2 |
| 7   |                         1354  |           |
| 8   |                         1369  |    HIJ150 |
| 9   |                         1372  |     DEF64 |
| 10  |                         1373  |      KLM9 |
| 11  |                         1374  |      DEF1 |
| 12  |                         1381  |           |
| 13  |                         1385  |           |
| 14  |                         1391  |           |
| 15  |                         1394  |           |
| 16  |                         1395  |           |
| 17  |                         1402  |           |
| 18  |                         1404  |           |
| 19  |                         1405  |           |
| 20  |                         1406  |           |
| 21  |                         1408  |           |
| 22  |                         1410  |    HIJ116 |
| 23  |                         1412  |           |
+-----+-------------------------------+-----------+

就像dropna()根本不起作用。我什至将其他合同csv中的工作代码复制并粘贴到了该区域中,只是简单地更改了代码中的变量以匹配此csv,但它仍然无法正常工作。我重新检查以确保其他代码也能正常工作。

我尝试.dropna(how='any')无济于事。我该怎么办?

编辑:

对扎克曼的答案:

否,因为在那之后我要执行以下操作:

df_sourcing_events_final = df_sourcing_events.drop([sourcing_events_site_col], axis=1)

            write_dataframe_to_csv_on_s3(df_sourcing_events_sites, s3_bucket, 'sourcing_events_sites.csv')

            write_dataframe_to_csv_on_s3(df_sourcing_events_final, s3_bucket, file_name)

我正在将作为列表的一列拆分为单独的行,并从中创建一个新的csv,以加载到单独的表中。

2 个答案:

答案 0 :(得分:0)

之所以不会删除是因为它们是空字符串,不是N / A。试试:

df = df_sourcing_events_sites
df = df[df.Site != '']

答案 1 :(得分:0)

dropna()仅丢弃“真实” NaN。但有时csv文件包含被熊猫视为字符串的na。在您的情况下,我认为这些是空字符串""

在任何情况下,read_csv方法都有一个na_values参数,您可以使用所需的字符串值进行填充。您可以尝试na_values="",但我无法预测其结果。