从包含4列的数据框中创建仅包含1列的数据框

时间:2017-05-30 19:40:18

标签: python pandas

我有一个包含4列的数据框(它们都是部件号)。我想要的只是这个数据帧只有1列包含4个原始列的所有值(删除重复项除外)。这就是我所做的。我没有收到任何错误消息,但由于某种原因,我在进行合并时不断获得4列而不是1列。首先我写了这个:

Supplier_Part_No = Supplier_Part_Numbers_Rename[['Supplier_Part_No']].copy()
Supplier_Part_No_1 = Supplier_Part_Numbers_Rename[['Supplier_Part_No..1']].copy()
Supplier_Part_No_2 = Supplier_Part_Numbers_Rename[['Supplier_Part_No..2']].copy()
Supplier_Part_No_3 = Supplier_Part_Numbers_Rename[['Supplier_Part_No..3']].copy()

创建了4个数据帧。然后我将它们合并回来,意图在数据帧中获得一个单独的列。我不知道为什么它一直给我4,我也尝试做轴1没有帮助。不知道为什么它不给我只有1列但是只改为4列:

Supplier_Parts_Combined = pd.concat([Supplier_Part_No, Supplier_Part_No_1,Supplier_Part_No_2, Supplier_Part_No_3], axis = 0)

Supplier_Parts_Combined

2 个答案:

答案 0 :(得分:1)

这是你想要的吗?

df = pd.DataFrame(np.random.randint(0,5,size=(5, 4)), columns=list('ABCD'))

    A   B   C   D
0   1   4   2   2
1   4   0   3   2
2   1   0   1   0
3   3   4   3   4
4   0   2   4   2


df['merged'] = df.astype(str).apply(lambda x: ''.join(set(x)), axis = 1)

    A   B   C   D   new
0   1   4   2   2   241
1   4   0   3   2   2430
2   1   0   1   0   01
3   3   4   3   4   43
4   0   2   4   2   204

编辑:

考虑这个df

df = pd.DataFrame({'val1': ['abc', np.nan], 'val2': ['xyz', 'pqr'], 'val3': ['lmn', 'abc'], 'val4': [np.nan, np.nan]})

    val1    val2    val3    val4
0   abc     xyz     lmn     NaN
1   NaN     pqr     abc     NaN

x = df.values.ravel()
np.unique(x[~pd.isnull(x)])

会给你

array(['abc', 'lmn', 'pqr', 'xyz'], dtype=object)

答案 1 :(得分:0)

只需使用pandas.melt将数据重新整形为长格式,并使用变量名称(以前的列名称)和值列(以前的宽格式列值)。由于您只需要一列没有NAs,因此请使用dropna[[..]]索引:

from io import StringIO
import pandas as pd

txt = """
Supplier_Part_1     Supplier_Part_2     Supplier_Part_3          
abc                        cde                        NA 
NA                         gbc                        NA 
"""

df = pd.read_table(StringIO(txt), sep="\s+")
print(df)

#   Supplier_Part_1 Supplier_Part_2  Supplier_Part_3
# 0             abc             cde              NaN
# 1             NaN             gbc              NaN


rdf = pd.melt(df, var_name="Supplier_Part_ID", value_name="Supplier_Part").\
              dropna().reset_index()[['Supplier_Part']]
print(rdf)

#   Supplier_Part
# 0           abc
# 1           cde
# 2           gbc