Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将唯一的列值转换为列名,并将所有相关的服务器名称置于其下_Python_Python 3.x_Pandas - Fatal编程技术网

Python 将唯一的列值转换为列名,并将所有相关的服务器名称置于其下

Python 将唯一的列值转换为列名,并将所有相关的服务器名称置于其下,python,python-3.x,pandas,Python,Python 3.x,Pandas,根据ENC1001和ENC1002 这只是两个ENC1001和ENC1002,但我有数百个 熊猫代码: 输出: 需要什么: 谢谢您的帮助。在数据帧中,同一行不同列的不同值之间存在一些关系。因此,我认为使用数据帧来获得您想要的并不是最好的方法 print(df.head(9)) Server Enclosure Hardware Bay Server Name 0 ENC1001 C7000 bay1 dpcfl1001.exa

根据
ENC1001
ENC1002

这只是两个
ENC1001
ENC1002
,但我有数百个

熊猫代码: 输出: 需要什么:
谢谢您的帮助。

在数据帧中,同一行不同列的不同值之间存在一些关系。因此,我认为使用数据帧来获得您想要的并不是最好的方法

print(df.head(9))


Server Enclosure Hardware   Bay            Server Name
    0  ENC1001              C7000  bay1  dpcfl1001.example.com
    1  ENC1001              C7000  bay2  dpcfl1002.example.com
    2  ENC1001              C7000  bay3  dpcfl1003.example.com
    3  ENC1001              C7000  bay4  dpcfl1004.example.com
    4  ENC1001              C7000  bay5  dpcfl1005.example.com
    5  ENC1001              C7000  bay6  dpcfl1006.example.com
    6  ENC1001              C7000  bay7  dpcfl1007.example.com
    7  ENC1001              C7000  bay8  dpcfl1008.example.com
    8  ENC1001              C7000  bay9  dpcfl1009.example.com  

 

 

    df2=df.groupby(['Server','Enclosure Hardware','Bay'])['Server Name'].apply(lambda x: pd.Series(x.tolist())).unstack('Server').fillna('None').reset_index().drop(columns=['level_2'])



Server Enclosure Hardware    Bay                ENC1001                ENC1002
0                   C7000   bay1  dpcfl1001.example.com  dpcfl1012.example.com
1                   C7000  bay10  dpcfl1010.example.com                   None
2                   C7000  bay11  dpcfl1011.example.com                   None
3                   C7000  bay12                inc1001                   None
4                   C7000  bay13                inc1003                   None
5                   C7000  bay14  dpcfl2313.example.com                   None
6                   C7000  bay15                lic1002                   None
7                   C7000   bay2  dpcfl1002.example.com  dpcfl1013.example.com
8                   C7000   bay3  dpcfl1003.example.com  dpcfl1014.example.com
9                   C7000   bay4  dpcfl1004.example.com  dpcfl1015.example.com
10                  C7000   bay5  dpcfl1005.example.com  dpcfl1016.example.com
11                  C7000   bay6  dpcfl1006.example.com  dpcfl1017.example.com
12                  C7000   bay7  dpcfl1007.example.com  dpcfl1018.example.com
13                  C7000   bay8  dpcfl1008.example.com                   None
14                  C7000   bay9  dpcfl1009.example.com                   None
我建议使用字典,其中键是
Server
,值是
Server Name
,如下所示:

from collections import defaultdict

dd = defaultdict(list)
for name, group in df.groupby("Server"):
    dd[name] = group["Server Name"].values
>>> dd["ENC1001"]
['dpcfl1001.example.com' 'dpcfl1002.example.com' 'dpcfl1003.example.com'
 'dpcfl1004.example.com' 'dpcfl1005.example.com' 'dpcfl1006.example.com'
 'dpcfl1007.example.com' 'dpcfl1008.example.com' 'dpcfl1009.example.com'
 'dpcfl1010.example.com' 'dpcfl1011.example.com' 'inc1001' 'inc1003'
 'dpcfl2313.example.com' 'lic1002']

>>> dd["ENC1002"]
['dpcfl1012.example.com' 'dpcfl1013.example.com' 'dpcfl1014.example.com'
 'dpcfl1015.example.com' 'dpcfl1016.example.com' 'dpcfl1017.example.com'
 'dpcfl1018.example.com']
现在,您可以打印
服务器的所有
服务器名称
,如下所示:

from collections import defaultdict

dd = defaultdict(list)
for name, group in df.groupby("Server"):
    dd[name] = group["Server Name"].values
>>> dd["ENC1001"]
['dpcfl1001.example.com' 'dpcfl1002.example.com' 'dpcfl1003.example.com'
 'dpcfl1004.example.com' 'dpcfl1005.example.com' 'dpcfl1006.example.com'
 'dpcfl1007.example.com' 'dpcfl1008.example.com' 'dpcfl1009.example.com'
 'dpcfl1010.example.com' 'dpcfl1011.example.com' 'inc1001' 'inc1003'
 'dpcfl2313.example.com' 'lic1002']

>>> dd["ENC1002"]
['dpcfl1012.example.com' 'dpcfl1013.example.com' 'dpcfl1014.example.com'
 'dpcfl1015.example.com' 'dpcfl1016.example.com' 'dpcfl1017.example.com'
 'dpcfl1018.example.com']
如果要将其转换为
pandas.DataFrame
,只需运行:

>>> new_df = pd.DataFrame.from_dict(dd, orient='index').T
                  ENC1001                ENC1002
0   dpcfl1001.example.com  dpcfl1012.example.com
1   dpcfl1002.example.com  dpcfl1013.example.com
2   dpcfl1003.example.com  dpcfl1014.example.com
3   dpcfl1004.example.com  dpcfl1015.example.com
4   dpcfl1005.example.com  dpcfl1016.example.com
5   dpcfl1006.example.com  dpcfl1017.example.com
6   dpcfl1007.example.com  dpcfl1018.example.com
7   dpcfl1008.example.com                   None
8   dpcfl1009.example.com                   None
9   dpcfl1010.example.com                   None
10  dpcfl1011.example.com                   None
11                inc1001                   None
12                inc1003                   None
13  dpcfl2313.example.com                   None
14                lic1002                   None

在数据帧中,同一行不同列的不同值之间存在一些关系。因此,我认为使用数据帧来获得您想要的并不是最好的方法

我建议使用字典,其中键是
Server
,值是
Server Name
,如下所示:

from collections import defaultdict

dd = defaultdict(list)
for name, group in df.groupby("Server"):
    dd[name] = group["Server Name"].values
>>> dd["ENC1001"]
['dpcfl1001.example.com' 'dpcfl1002.example.com' 'dpcfl1003.example.com'
 'dpcfl1004.example.com' 'dpcfl1005.example.com' 'dpcfl1006.example.com'
 'dpcfl1007.example.com' 'dpcfl1008.example.com' 'dpcfl1009.example.com'
 'dpcfl1010.example.com' 'dpcfl1011.example.com' 'inc1001' 'inc1003'
 'dpcfl2313.example.com' 'lic1002']

>>> dd["ENC1002"]
['dpcfl1012.example.com' 'dpcfl1013.example.com' 'dpcfl1014.example.com'
 'dpcfl1015.example.com' 'dpcfl1016.example.com' 'dpcfl1017.example.com'
 'dpcfl1018.example.com']
现在,您可以打印
服务器的所有
服务器名称
,如下所示:

from collections import defaultdict

dd = defaultdict(list)
for name, group in df.groupby("Server"):
    dd[name] = group["Server Name"].values
>>> dd["ENC1001"]
['dpcfl1001.example.com' 'dpcfl1002.example.com' 'dpcfl1003.example.com'
 'dpcfl1004.example.com' 'dpcfl1005.example.com' 'dpcfl1006.example.com'
 'dpcfl1007.example.com' 'dpcfl1008.example.com' 'dpcfl1009.example.com'
 'dpcfl1010.example.com' 'dpcfl1011.example.com' 'inc1001' 'inc1003'
 'dpcfl2313.example.com' 'lic1002']

>>> dd["ENC1002"]
['dpcfl1012.example.com' 'dpcfl1013.example.com' 'dpcfl1014.example.com'
 'dpcfl1015.example.com' 'dpcfl1016.example.com' 'dpcfl1017.example.com'
 'dpcfl1018.example.com']
如果要将其转换为
pandas.DataFrame
,只需运行:

>>> new_df = pd.DataFrame.from_dict(dd, orient='index').T
                  ENC1001                ENC1002
0   dpcfl1001.example.com  dpcfl1012.example.com
1   dpcfl1002.example.com  dpcfl1013.example.com
2   dpcfl1003.example.com  dpcfl1014.example.com
3   dpcfl1004.example.com  dpcfl1015.example.com
4   dpcfl1005.example.com  dpcfl1016.example.com
5   dpcfl1006.example.com  dpcfl1017.example.com
6   dpcfl1007.example.com  dpcfl1018.example.com
7   dpcfl1008.example.com                   None
8   dpcfl1009.example.com                   None
9   dpcfl1010.example.com                   None
10  dpcfl1011.example.com                   None
11                inc1001                   None
12                inc1003                   None
13  dpcfl2313.example.com                   None
14                lic1002                   None

你可以这样做:

pd.concat([g.set_index('Bay').add_suffix(f'_{n}') for n, g in df.groupby('Server')], 
          axis=1, sort=False).filter(like='Server Name')
输出:

          Server Name_ENC1001    Server Name_ENC1002
bay 1   dpcfl1001.example.com  dpcfl1012.example.com
bay 2   dpcfl1002.example.com  dpcfl1013.example.com
bay 3   dpcfl1003.example.com  dpcfl1014.example.com
bay 4   dpcfl1004.example.com  dpcfl1015.example.com
bay 5   dpcfl1005.example.com  dpcfl1016.example.com
bay 6   dpcfl1006.example.com  dpcfl1017.example.com
bay 7   dpcfl1007.example.com  dpcfl1018.example.com
bay 8   dpcfl1008.example.com                    NaN
bay 9   dpcfl1009.example.com                    NaN
bay 10  dpcfl1010.example.com                    NaN
bay 11  dpcfl1011.example.com                    NaN
bay 12                inc1001                    NaN
bay 13                inc1003                    NaN
bay 14  dpcfl2313.example.com                    NaN
bay 15                lic1002                    NaN

你可以这样做:

pd.concat([g.set_index('Bay').add_suffix(f'_{n}') for n, g in df.groupby('Server')], 
          axis=1, sort=False).filter(like='Server Name')
输出:

          Server Name_ENC1001    Server Name_ENC1002
bay 1   dpcfl1001.example.com  dpcfl1012.example.com
bay 2   dpcfl1002.example.com  dpcfl1013.example.com
bay 3   dpcfl1003.example.com  dpcfl1014.example.com
bay 4   dpcfl1004.example.com  dpcfl1015.example.com
bay 5   dpcfl1005.example.com  dpcfl1016.example.com
bay 6   dpcfl1006.example.com  dpcfl1017.example.com
bay 7   dpcfl1007.example.com  dpcfl1018.example.com
bay 8   dpcfl1008.example.com                    NaN
bay 9   dpcfl1009.example.com                    NaN
bay 10  dpcfl1010.example.com                    NaN
bay 11  dpcfl1011.example.com                    NaN
bay 12                inc1001                    NaN
bay 13                inc1003                    NaN
bay 14  dpcfl2313.example.com                    NaN
bay 15                lic1002                    NaN


尝试:
df.pivot(columns=“Server”,values=“Server Name”)
尝试:
df.pivot(columns=“Server”,values=“Server Name”)
感谢您的回答+1,共有四个列名
Server
Enclosure Hardware
Bay
Server Name
,我想我们需要通过
服务器
?查看我的编辑。希望我的专栏是对的。我把头像印出来让你看。我使用的是df=pd.read_clipboard(),这可能会扭曲列答案+1,有四个列名称
Server
Enclosure Hardware
Bay
Server Name
,我想我们需要通过
Server
查看我的编辑。希望我的专栏是对的。我把头像印出来让你看。我使用的是df=pd.read_clipboard(),这可能会扭曲答案Anwarvic+1的列签名,但我希望所有内容都能自行排序,而不是手动选择。对不起,我不知道你的意思。我的意思是格式将与文章中所需的输出相同。我已编辑了我的答案。。。希望这就是你的意思:)谢谢Anwarvic+1的答案,但我希望它能自动排序,而不是手动选择。对不起,我不知道你的意思。我的意思是格式将与文章中所需的输出相同。我已经编辑了我的答案。。。希望这就是你的意思:)谢谢Scott+1,这是另一种很好的方式。这是一个最好的选择,也是最合适的,正如我看到的机架号一样。@user294110谢谢。快乐编码!您正在为每一列添加后缀,后缀为服务器,然后使用“axis=1”并排连接所有这些组,最后,使用筛选器仅选择以“Server Name”开头的列。@krock1516请尝试:
pd.concat([g.set_index('Bay')['Server Name'])。在df.groupby('Server')中为n,g重命名(f'{n})],axis=1,sort=False)
谢谢Scott+1,这是另一种很好的解决方法。这是一个最好的选择,也是最合适的,因为我看到了机架号。@user294110谢谢。快乐编码!您正在为每一列添加后缀,后缀为服务器,然后使用“axis=1”并排连接所有这些组,最后,使用筛选器仅选择以“Server Name”开头的列。@krock1516请尝试:
pd.concat([g.set_index('Bay')['Server Name'])。在df.groupby('Server')中为n,g重命名(f'{n})],轴=1,排序=False)