Python,dataframes:复制列表列中的元素,并将其归于另一列中的行

时间:2017-01-19 07:51:45

标签: python pandas dataframe

我想将数据帧的一行复制到我的第一个colulmn中的元素。

我有以下数据框:

     columns_A           columns_B
0    [1,2,3,4]           ['bob', 'mary']
1    [7,9]               ['banana', 'apple']

我想要结果:

     columns_A            columns_B
0    1                   ['bob', 'mary']
1    2                   ['bob', 'mary']
2    3                   ['bob', 'mary']
3    4                   ['bob', 'mary']
4    7                   ['banana', 'apple']
5    9                   ['banana', 'apple']

现在我可以访问column_A列表,但是我无法为column_B中的每个元素分配相应的列表。 下面的代码为我提供了所有元素的第一行column_B。我不知道如何根据column_A中line1的位置来定义行。

for line1 in df.column_A:
    for i in line1:
        s= {i : df.column_B[0]} 
        print s 

感谢您的帮助

2 个答案:

答案 0 :(得分:3)

我认为您可以numpy.repeat使用str.len来表示重复值,lists可以使用嵌套chain的平面值:

from itertools import chain

df2 = pd.DataFrame({
        "columns_B": np.repeat(df.columns_B.values, df.columns_A.str.len()),
        "columns_A": list(chain.from_iterable(df.columns_A))})

print (df2)
   columns_A        columns_B
0          1      [bob, mary]
1          2      [bob, mary]
2          3      [bob, mary]
3          4      [bob, mary]
4          7  [banana, apple]
5          9  [banana, apple]

纯大熊猫解决方案是由Series构造函数和join创建的stack DataFrame

df2 = pd.DataFrame(df.columns_A.values.tolist())
        .stack()
        .reset_index(level=1, drop=True)
        .astype(int)
        .rename('columns_A')
print (df2)
0    1
0    2
0    3
0    4
1    7
1    9
Name: columns_A, dtype: int32

print (df.drop('columns_A', axis=1).join(df2).reset_index(drop=True))
         columns_B  columns_A
0      [bob, mary]          1
1      [bob, mary]          2
2      [bob, mary]          3
3      [bob, mary]          4
4  [banana, apple]          7
5  [banana, apple]          9

答案 1 :(得分:3)

使用pd.melt

a, b = df
pd.melt(
    df.drop(a, 1).join(df[a].apply(pd.Series)),
    b, [0, 1, 2, 3], value_name=a
).dropna()[df.columns.tolist()].astype(df.dtypes) \
 .sort_values(b, ascending=False).reset_index(drop=True)

  columns_A        columns_B
0         1      [bob, mary]
1         2      [bob, mary]
2         3      [bob, mary]
3         4      [bob, mary]
4         7  [banana, apple]
5         9  [banana, apple]