pandas 列赋值问题

      df1['A']=df2['flag'] 是pandas数据处理常用的一种列赋值的方法。

今天在进行列赋值时,发现处理后的结果不符合预期。查阅了一些资料,df1['A']=df2['flag']不是直接整列赋值的,而是根据索引index的映射来进行赋值的。df1,df2两个表的index如果不相同会出现NA空值的情况。特别是 df1是按照某列groupby处理后的表,df2保持着原来的index,这种情况很容易发生index不相同而导致空值的问题。


# coding: utf-8


import pandas as pd

#df1,df2两个index不相同的表
df1 = pd.DataFrame({"A": ["foo", "foo", "foo", "foo", "foo",
                         "bar", "bar", "bar", "bar",'bar'],
                  "B": ["small", "large", "large", "small",
                         "small", "large", "small", "small",
                         "large",'medium']},index=[1,2,3,4,5,6,7,8,9,10])
print(df1)
"""
      A       B  flag
1   foo   small     1
2   foo   large     2
3   foo   large     3
4   foo   small     4
5   foo   small     5
6   bar   large     6
7   bar   small     7
8   bar   small     8
9   bar   large     9
10  bar  medium    10
"""
df2 = pd.DataFrame({"A": ["foo", "foo", "foo", "foo", "foo",
                         "bar", "bar", "bar", "bar",'bar'],
                  "C": ["small", "large", "large", "small",
                         "small", "large", "small", "small",
                         "large",'medium'],
                  "flag":[i+1 for i in range(10)]},
                  index=[10,9,8,7,6,5,4,3,2,1])
print(df2)
"""
      A       C  flag
10  foo   small     1
9   foo   large     2
8   foo   large     3
7   foo   small     4
6   foo   small     5
5   bar   large     6
4   bar   small     7
3   bar   small     8
2   bar   large     9
1   bar  medium    10
"""

#直接对df1 flag列赋值是按照index映射关系
df1['flag']=df2['flag']
print(df1)
"""
      A       B  flag
1   foo   small     1
2   foo   large     2
3   foo   large     3
4   foo   small     4
5   foo   small     5
6   bar   large     6
7   bar   small     7
8   bar   small     8
9   bar   large     9
10  bar  medium    10

"""

#如何将 df2['flag']按照原有表的顺序赋值下来
df1['flag']=df2['flag'].tolist()           #直接使用list
print(df1)

"""
      A       B  flag
1   foo   small     1
2   foo   large     2
3   foo   large     3
4   foo   small     4
5   foo   small     5
6   bar   large     6
7   bar   small     7
8   bar   small     8
9   bar   large     9
10  bar  medium    10
"""

猜你喜欢

转载自blog.csdn.net/springtostring/article/details/105277778
今日推荐